图像处理基本算法-滤波
線性濾波器的向量表示:
W是一個(gè)大小為m*n的濾波器的系數(shù),Z為由濾波器覆蓋的相應(yīng)圖像的灰度值。
線性濾波器所能是實(shí)現(xiàn)的就是乘積求和操作。
幾種常見的濾波器:
平滑空間濾波器如均值濾波
統(tǒng)計(jì)排序?yàn)V波器如中值濾波
銳化空間濾波器如銳化濾波
1、? 均值濾波
?
?
均值濾波在去噪聲的同時(shí)會(huì)有如下缺點(diǎn):
邊界模糊效應(yīng)明顯
細(xì)節(jié)丟失比較嚴(yán)重
?
2、? 中值濾波
中值濾波在邊界的保存方面優(yōu)于均值濾波,是經(jīng)常使用的一種濾波器,但
是在模板逐漸變大時(shí),依然會(huì)存在一定的邊界模糊
中值濾波對(duì)處理椒鹽噪聲非常有效,或者稱為脈沖噪聲。
?
如果既想去除噪聲,又極大的保存細(xì)節(jié),此時(shí)應(yīng)該考慮變形蟲算法模板的大小是與周圍的像素有關(guān),模板隨環(huán)境自動(dòng)變化大小,這樣在細(xì)節(jié)較小的區(qū)域可以使用較大的模板,而在細(xì)節(jié)較多的區(qū)域使用更小的模板。變形蟲算法,以后再講。
濾波器一般為盒狀濾波器,能不能使用其他形狀的濾波器,以得到更好的濾波效果呢?
?源代碼:
//中值濾波和均值濾波 #include<cv.h> #include<highgui.h> int main(){ IplImage * image,*image2,*image3; image = cvLoadImage("E:\\image\\Dart.bmp",0);//以灰度圖像的形式讀入圖片 cvNamedWindow("image",CV_WINDOW_AUTOSIZE); cvNamedWindow("image2",CV_WINDOW_AUTOSIZE); cvNamedWindow("image3",CV_WINDOW_AUTOSIZE); //cvSaveImage("E:\\image\\moon.jpg",image,0); cvShowImage("image",image); //cvWaitKey(0); unsigned char * ptr,*dst; int i,j,m,n,sum,temp,r,s; image2 = cvCreateImage(cvGetSize(image),image->depth,1); image3 = cvCreateImage(cvGetSize(image),image->depth,1); //模板1 均值 int tem[9] = {1,1,1,1,1,1,1,1,1}; //也可以使用改進(jìn)的高斯模板,但是效果相近 int tem2[9] = {0};//獲取中值時(shí)用于排序 //均值濾波3*3模板的均值 for( i = 0 ; i < image->height;i++){ for( j = 0; j< image->width;j++){ //邊界處理 if(i == 0 || i == image->height || j == 0 || j == image->width){ ptr = (unsigned char *)image->imageData + i*image->widthStep + j; dst = (unsigned char *)image2->imageData+ i*image2->widthStep+ j; *dst = *ptr; //邊界值賦予源圖像的值 } else { sum = 0; for( m = -1 ; m <= 1; m++ ){ for( n = -1 ; n <= 1 ; n++){ ptr = (unsigned char *)image->imageData + (i + m)*image->widthStep + j + n; sum += (*ptr) * tem[3*(m+1) + n+1]; } } dst = (unsigned char *)image2->imageData+ i *image2->widthStep+ j; *dst = (unsigned char)((sum +4)/9);//賦新值,四舍五入 } } } //中值濾波 在去除噪聲的同時(shí),圖像的模糊程度比較小,比均值濾波更加適合 //沖擊噪聲或者稱為椒鹽噪聲 for( i = 0 ; i < image->height;i++){ for( j = 0; j< image->width;j++){ //邊界處理 if(i == 0 || i == image->height || j == 0 || j == image->width){ ptr = (unsigned char *)image->imageData + i*image->widthStep + j; dst = (unsigned char *)image3->imageData+ i*image3->widthStep+ j; *dst = *ptr; //邊界值賦予源圖像的值 } else { temp = 0; //將3*3模板覆蓋的值拷貝進(jìn)數(shù)組,一邊查找中值 for( m = -1 ; m <= 1; m++ ){ for( n = -1 ; n <= 1 ; n++){ ptr = (unsigned char *)image->imageData + (i + m)*image->widthStep + j + n; tem2[3*(m+1) +n +1] = *ptr; //printf("%d",*ptr); } } //對(duì)數(shù)組進(jìn)行冒泡排序 for(r = 0 ; r <8; r ++){ for(s = 0 ; s< r -1; s++ ){ if(tem2[s] > tem2[s+1]){ temp = tem2[s]; tem2[s] = tem2[s+1]; tem2[s+1] = temp; } } } //printf("%d",tem2[4]); //對(duì)新圖賦予新值 dst = (unsigned char *)image3->imageData+ i *image3->widthStep+ j; *dst = (unsigned char)(tem2[4]);//賦新值 } } } cvShowImage("image2",image2); cvShowImage("image3",image3); cvWaitKey(0); cvSaveImage("E:\\image\\Dart2.bmp",image2,0); cvSaveImage("E:\\image\\Dart3.bmp",image3,0); return 0; }效果圖:
原圖:
均值濾波:
中值濾波:
?
可以看到,均值濾波缺點(diǎn)明顯:
邊界模糊效應(yīng)明顯
細(xì)節(jié)丟失比較嚴(yán)重
而中值濾波在保持細(xì)節(jié)方面明顯優(yōu)于均值濾波。
在濾波模板變大時(shí),效果如何呢?
matlab源碼: A = imread('Dart.bmp') %采用中值濾波和均值濾波的比較 %模板大小的改變對(duì)濾波效果的影響 subplot(3,3,1) imshow(A) for n = 1 : 8 m = 2*n +1 B = medfilt2(A ,[m,m]) subplot(3,3,n+1) imshow(B) end %采用均值濾波查看圖像的變化 subplot(3,3,1) imshow(A) for n = 1 : 8 m = 2*n +1 C = imfilter(A,[m,m]); subplot(3,3,n+1) imshow(B) end效果圖:
均值濾波加大模板的效果:
中值濾波加大模板的效果:
可以看出隨著模板的加大,中值濾波的模糊度也在增加,但是比均值要好很多。
3、Laplace圖像銳化
銳化空間濾波器的一階二階微分的零交叉對(duì)于邊緣定位非常有用
圖像的邊緣經(jīng)一階微分產(chǎn)生較粗的邊緣
二階微分產(chǎn)生由0分開的一個(gè)雙邊緣,這是一個(gè)適合銳化圖像的理想特征。
銳化laplace算子可以突出圖像中的灰度突變,但并不強(qiáng)調(diào)灰度緩慢變化的區(qū)域。
兩種常用的Laplace模板:
0 ?1? 0
1 ?-4?1
0 ?1? 0
?
1 1?1
1 -8 1
1 1?1
?
但是得到突變的區(qū)域之后該怎么用呢?
事實(shí)上,如果源圖像和laplace圖像和疊加,這樣既可以復(fù)原原圖的背景特性,并保持laplace銳化處理的效果。這樣做可以極大的增強(qiáng)圖像的細(xì)節(jié)。
源代碼:
//銳化濾波,并利用銳化濾波增強(qiáng)圖像的細(xì)節(jié) #include<cv.h> #include<highgui.h> int main(){ IplImage * image,*image2,*image3; image = cvLoadImage("E:\\image\\moon.tif",0); cvNamedWindow("image",CV_WINDOW_AUTOSIZE); cvNamedWindow("image2",CV_WINDOW_AUTOSIZE); cvNamedWindow("image3",CV_WINDOW_AUTOSIZE); cvSaveImage("E:\\image\\moon.jpg",image,0); cvShowImage("image",image); //cvWaitKey(0); unsigned char * ptr,*dst; image2 = cvCreateImage(cvGetSize(image),image->depth,1); image3 = cvCreateImage(cvGetSize(image),image->depth,1); int i,j,m,n,sum; //銳化模板 int tem[9] = {0,1,0,1,-4,1,0,1,0}; //銳化濾波 for( i = 0 ; i < image->height;i++){ for( j = 0; j< image->width;j++){ //邊界處理 if(i == 0 || i == image->height || j == 0 || j == image->width){ ptr = (unsigned char *)image->imageData + i*image->widthStep + j; dst = (unsigned char *)image2->imageData+ i*image2->widthStep+ j; *dst = *ptr; //邊界值賦予源圖像的值 } else { sum = 0; for( m = -1 ; m <= 1; m++ ){ for( n = -1 ; n <= 1 ; n++){ ptr = (unsigned char *)image->imageData + (i + m)*image->widthStep + j + n; sum += (*ptr) * tem[3*(m+1) + n+1]; } } dst = (unsigned char *)image2->imageData+ i *image2->widthStep+ j; *dst = (unsigned char)((sum +4)/9);//賦新值,四舍五入 } } } //銳化的圖像與源圖像相加,但是在相加之前需要先講銳化的值稍微降低一些 cvShowImage("image2",image2); for( i = 0 ; i < image2->height;i++){ for( j = 0; j< image->width;j++){ ptr = (unsigned char *)image2->imageData + i*image2->widthStep + j; *ptr = ((*ptr)+4)/5; } } cvAdd(image,image2,image3,0); cvShowImage("image3",image3); cvWaitKey(0); cvSaveImage("E:\\image\\moon2.jpg",image2,0); cvSaveImage("E:\\image\\moon3.jpg",image3,0); return 0; }原圖:
銳化圖像:
疊加圖像:
由疊加圖像可知,經(jīng)過(guò)銳化處理和疊加之后,圖像的細(xì)節(jié)部分更加清晰。總結(jié)
以上是生活随笔為你收集整理的图像处理基本算法-滤波的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机二级文化基础知识,全国计算机二级o
- 下一篇: Luogu 4284 [SHOI2014