else {
cvDilate(src,dst,element,1); cvErode(dst,dst,element,1); }
cvReleaseStructuringElement(&element); cvShowImage(\}
// callback function for erode/dilate trackbar void ErodeDilate(int pos) {
int n = erode_dilate_pos - max_iters; int an = n > 0 ? n : -n;
element = cvCreateStructuringElementEx( an*2+1, an*2+1, an, an, element_shape, 0 ); if( n < 0 ) {
cvErode(src,dst,element,1); } else {
cvDilate(src,dst,element,1); }
cvReleaseStructuringElement(&element); cvShowImage(\}
int main( int argc, char** argv ) {
char* filename = argc == 2 ? argv[1] : (char*)\ if( (src = cvLoadImage(filename,1)) == 0 ) return -1;
printf( \
\
\ \
\ \ dst = cvCloneImage(src);
//create windows for output images cvNamedWindow(\ cvNamedWindow(\
open_close_pos = erode_dilate_pos = max_iters; cvCreateTrackbar(\
\ cvCreateTrackbar(\
\ for(;;) {
int c;
OpenClose(open_close_pos);
ErodeDilate(erode_dilate_pos); c = cvWaitKey(0);
if( (char)c == 27 ) break;
if( (char)c == 'e' )
element_shape = CV_SHAPE_ELLIPSE; else if( (char)c == 'r' )
element_shape = CV_SHAPE_RECT; else if( (char)c == 'c' )
element_shape = CV_SHAPE_CROSS; else if( (char)c == '\\n' )
element_shape = (element_shape + 1) % 3; }
//release images
cvReleaseImage(&src); cvReleaseImage(&dst);
//destroy windows
cvDestroyWindow(\ cvDestroyWindow(\ return 0; }
用不同的核进行图像的二维滤波
函数cvSmooth实现各种方法的图形平滑。
一般来说,图像平滑主要是为了消除噪声。图像的常见噪声主要有加性噪声、乘性噪声和量化噪声等。由于图像的能量主要集在低频部分,而噪声所在频段主要在高频段,因此通常都是采用低通滤波的方法消除噪声。 函数cvFilter2D对图像做卷积运算。
对图像进行线性滤波,支持替换方式操作。当核运算部份超出输入图像时,边界外面的像素值等于离它最近的图像像素值。 效果图:
源代码:
// Filtering for Image with variaty filtering kernel //
// CV_PREWITT_3x3_V A gradient filter (vertical Prewitt operator). // -1 0 1 // -1 0 1 // -1 0 1
// CV_PREWITT_3x3_H A gradient filter (horizontal Prewitt operator). // 1 1 1 // 0 0 0 // -1 -1 -1
// CV_SOBEL_3x3_V A gradient filter (vertical Sobel operator). // -1 0 1 // -2 0 2 // -1 0 1
// CV_SOBEL_3x3_H A gradient filter (horizontal Sobel operator). // 1 2 1 // 0 0 0 // -1 -2 -1
// CV_LAPLACIAN_3x3 A 3x3 Laplacian highpass filter. // -1 -1 -1 // -1 8 -1 // -1 -1 -1
// CV_LAPLACIAN_3x3 A 3x3 Laplacian highpass filter (another kernel) // This kernel is similar with function: cvLaplace with aperture_size=1 // 0 1 0 // 1 -4 1
// 0 1 0 注:直接用cvFilter2D得到的结果与用cvLaplace得到的结果
// 略有不同
// CV_LAPLACIAN_5x5 A 5x5 Laplacian highpass filter. // -1 -3 -4 -3 -1 // -3 0 6 0 -3 // -4 6 20 6 -4 // -3 0 6 0 -3 // -1 -3 -4 -3 -1
// CV_GAUSSIAN_3x3 A 3x3 Gaussian lowpass filter. // This filter uses the kernel A/16,where // 1 2 1 // A = 2 4 2 // 1 2 1
// These filter coefficients correspond to a 2-dimensional Gaussian // distribution with standard deviation 0.85. //
// CV_GAUSSIAN_5x5 A 5x5 Gaussian lowpass filter. // This filter uses the kernel A/571,where // 2 7 12 7 2 // 7 31 52 31 7 // A = 12 52 127 52 12 // 7 31 52 31 7 // 2 7 12 7 2 #include
#include
int main( int argc, char** argv ) {
IplImage *src = 0, *dst = 0, *dst2 = 0; /*float k[9] = { 0, 1, 0, 1,-4, 1,
0, 1, 0}; */
float k[9] = { 1.f/16, 2.f/16, 1.f/16,
2.f/16, 4.f/16, 2.f/16,
1.f/16, 2.f/16, 1.f/16}; // 这里高斯核滤波器归一化
CvMat Km;
//cvInitMatHeader( &Km, 3, 3, CV_32FC1, k, CV_AUTOSTEP ); Km = cvMat( 3, 3, CV_32F, k ); // 0: force to gray image
src = cvLoadImage(\ dst = cvCloneImage( src );
cvNamedWindow(\ cvShowImage(\
cvNamedWindow(\
cvFilter2D( src, dst, &Km, cvPoint(-1,-1)); cvShowImage(\ cvWaitKey(0);
cvReleaseImage( &src ); cvReleaseImage( &dst ); return 0; }
图像域的填充
效果图: