图像处理经典算法及OpenCV程序(6)

2019-08-31 23:22

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 #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; }

图像域的填充

效果图:


图像处理经典算法及OpenCV程序(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:论责令限期拆除的法律性质

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: