圖像處理基本算法-濾波

線性濾波器的向量表示:


W是一個大小為m*n的濾波器的系數,Z為由濾波器覆蓋的相應圖像的灰度值。

線性濾波器所能是實現的就是乘積求和操作。

幾種常見的濾波器:

平滑空間濾波器如均值濾波

統計排序濾波器如中值濾波

銳化空間濾波器如銳化濾波

1、? 均值濾波

?

?

均值濾波在去噪聲的同時會有如下缺點:

邊界模糊效應明顯

細節丟失比較嚴重

?

2、? 中值濾波


中值濾波在邊界的保存方面優于均值濾波,是經常使用的一種濾波器,但

是在模板逐漸變大時,依然會存在一定的邊界模糊

中值濾波對處理椒鹽噪聲非常有效,或者稱為脈沖噪聲。

?

如果既想去除噪聲,又極大的保存細節,此時應該考慮變形蟲算法模板的大小是與周圍的像素有關,模板隨環境自動變化大小,這樣在細節較小的區域可以使用較大的模板,而在細節較多的區域使用更小的模板。變形蟲算法,以后再講。

濾波器一般為盒狀濾波器,能不能使用其他形狀的濾波器,以得到更好的濾波效果呢?

?源代碼:

    //中值濾波和均值濾波  #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};   //也可以使用改進的高斯模板,但是效果相近   int tem2[9] = {0};//獲取中值時用于排序  //均值濾波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);//賦新值,四舍五入  }   }  }  //中值濾波 在去除噪聲的同時,圖像的模糊程度比較小,比均值濾波更加適合  //沖擊噪聲或者稱為椒鹽噪聲  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模板覆蓋的值拷貝進數組,一邊查找中值  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);  }  }  //對數組進行冒泡排序  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]);  //對新圖賦予新值  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;  }  

效果圖:

原圖:


均值濾波:


中值濾波:

?

可以看到,均值濾波缺點明顯:

邊界模糊效應明顯

細節丟失比較嚴重

而中值濾波在保持細節方面明顯優于均值濾波。

在濾波模板變大時,效果如何呢?

matlab源碼:

    A = imread('Dart.bmp')  %采用中值濾波和均值濾波的比較  %模板大小的改變對濾波效果的影響  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圖像銳化

銳化空間濾波器的一階二階微分的零交叉對于邊緣定位非常有用

圖像的邊緣經一階微分產生較粗的邊緣

二階微分產生由0分開的一個雙邊緣,這是一個適合銳化圖像的理想特征。

銳化laplace算子可以突出圖像中的灰度突變,但并不強調灰度緩慢變化的區域。

兩種常用的Laplace模板:

0 ?1? 0

1 ?-4?1

0 ?1? 0

?

1 1?1

1 -8 1

1 1?1

?

但是得到突變的區域之后該怎么用呢?

事實上,如果源圖像和laplace圖像和疊加,這樣既可以復原原圖的背景特性,并保持laplace銳化處理的效果。這樣做可以極大的增強圖像的細節。

源代碼:

    //銳化濾波,并利用銳化濾波增強圖像的細節  #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;  }  

原圖:

銳化圖像:

疊加圖像:

由疊加圖像可知,經過銳化處理和疊加之后,圖像的細節部分更加清晰。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255547.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255547.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255547.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

20145122《Java面向對象程序設計》實驗二實驗報告

實驗名稱&#xff1a; Java面向對象程序設計 實驗內容&#xff1a; 初步掌握單元測試和TDD理解并掌握面向對象三要素&#xff1a;封裝、繼承、多態初步掌握UML建模熟悉S.O.L.I.D原則了解設計模式 PSP時間 步驟耗時百分比需求分析1h12.5%設計1h12.5%代碼實現3h37.5%測試1h12.5%分…

iOS中AutoLayer自動布局流程及相關方法

關于UIView的Layer&#xff0c;IOS提供了三個方法&#xff1a; 1、layoutSubviews 系統重寫布局:在iOS5.1和之前的版本&#xff0c;此方法的缺省實現不會做任何事情(實現為空)&#xff0c;iOS5.1之后(iOS6開始)的版本&#xff0c;此方法的缺省實現是使用你設置在此view上面的co…

移動開發web第一天

一、適配問題解決方案&#xff1a;流式布局 viewport1、流式布局百分比布局&#xff0c;通過設置盒子的寬度為百分比來根據屏幕的大小進行伸縮&#xff0c;特點是不受固定像素的限制&#xff0c;內容向兩側填充2、viewport在移動端用來承載網頁的這個區域&#xff0c;就是我們…

均值濾波 中值濾波 高斯平滑濾波

均值濾波是典型的線性濾波算法&#xff0c;它是指在圖像上對目標像素給一個模板&#xff0c;該模板包括了其周圍的臨近像素&#xff08;以目標象素為中心的周圍8個像素&#xff0c;構成一個濾波模板&#xff0c;即去掉目標像素本身&#xff09;&#xff0c;再用模板中的全體像素…

javaWeb開發總結 ---- 前端數據插入到后臺

一&#xff0c;概述&#xff1a; 本文主要描述如何將數據通過表單提交到后臺并插入到數據庫&#xff0e;其中后臺使用spring框架&#xff0e; 二&#xff0c;開發流程&#xff1a; 明確需求&#xff0c;即將什么數據插入到數據庫平臺搭建&#xff0c;配置spring, 數據庫&#…

對clear float 的理解

之前自己對于清除浮動的用法比較模糊 &#xff0c;如果用到的話&#xff0c;一般都是采用簡單粗暴的方式解決&#xff0c;就是直接用overflow&#xff1a;hidden&#xff0c;但是越用久就會發現其實有BUG&#xff0c;這個BUG正是overflow&#xff1a;hidden帶來的&#xff0c;因…

【機器視覺】——相機標定降低重投影誤差方法

目錄 一、標定結果分析 二、影響標定誤差的原因 1、平面標定板黑白棋盤格的精度

linux 安裝RedisLive

為什么80%的碼農都做不了架構師&#xff1f;>>> RedisLive 用來監控Redis&#xff0c;便于redis性能分析 安裝步驟&#xff1a; 1.安裝pip&#xff08;代碼參考&#xff1a;https://github.com/pypa/pip&#xff09; 官方網站&#xff1a;https://pypi.python.org/…

高斯濾波和雙向濾波的區別與聯系

1. 簡介 圖像平滑是一個重要的操作&#xff0c;而且有多種成熟的算法。這里主要簡單介紹一下Bilateral方法&#xff08;雙邊濾波&#xff09;&#xff0c;這主要是由于前段時間做了SSAO&#xff0c;需要用bilateral blur 算法進行降噪。Bilateral blur相對于傳統的高斯blur來說…

Eclipse變量名自動補全問題 自定義上屏按鍵為TAB

Eclipse空格等號等都可以上屏&#xff0c;這樣有時候輸入變量名再按空格就會自動補全&#xff0c;非常討厭。那么怎么辦呢&#xff1f; 1.首先你的Eclipse需要裝有 Eclipse plug-in development environment 和 Eclipse JDT Plug-in Developer Resources 或者直接去下載一個和…

Dreamweaver CS6 Mac破解版

介于之前小子分享的Mac版的Adobe的PS CS6和Illustrator CS6&#xff0c;有用戶要求小子分享下Dreamweaver&#xff0c;小子當然樂意效勞。 Dreamweaver CS6 是世界頂級軟件廠商Adobe推出的一套擁有可視化編輯界面&#xff0c;用于制作并編輯網站和移動應用程序的網頁設計軟件。…

【pyqt5學習】——graphicView顯示matplotlib圖像

目錄 一、導入模塊 二、自定義一個matplotlib窗口類Figure 三、利用QT_designer繪制窗口 四、寫邏輯代碼 五、結果展示 一、導入模塊 import matplotlibmatplotlib.use("Qt5Agg") from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg from matplo…

happens-before規則

1&#xff09;程序順序規則&#xff1a;一個線程中的每個操作&#xff0c;happens-before于該線程中的任意后續操作。2&#xff09;監視器鎖規則&#xff1a;對一個鎖的解鎖&#xff0c;happens-before于隨后對這個鎖的加鎖。3&#xff09;volatile變量規則&#xff1a;對一個v…

what is ssao

說到ssao 就要從ao說起&#xff0c;ao&#xff0c;即間接環境光遮蔽技術。我們知道現實中的光線&#xff0c;除了來自太陽和電燈的直射光線以外&#xff0c;光線碰到物體以后&#xff0c;還會再次反射&#xff0c;折射&#xff0c;而再次反射折射的過程中&#xff0c;又會被其他…

【pyqt5學習】——groupBox顯示matplotlib圖像

目錄 一、導入模塊 二、創建matplotlib窗口類 三、qt_designer設計窗口 四、邏輯代碼 五、結果展示 一、導入模塊 import matplotlibmatplotlib.use("Qt5Agg") from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg from matplotlib.figure impor…

[BZOJ3545][ONTAK2010]Peaks

[BZOJ3545][ONTAK2010]Peaks 試題描述 在Bytemountains有N座山峰&#xff0c;每座山峰有他的高度h_i。有些山峰之間有雙向道路相連&#xff0c;共M條路徑&#xff0c;每條路徑有一個困難值&#xff0c;這個值越大表示越難走&#xff0c;現在有Q組詢問&#xff0c;每組詢問詢問從…

杭電1027Ignatius and the Princess II模擬

地址&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1027 題目&#xff1a; Problem DescriptionNow our hero finds the door to the BEelzebub feng5166. He opens the door and finds feng5166 is about to kill our pretty Princess. But now the BEelzebub has t…

angular 使用rxjs 監聽同級兄弟組件數據變化

angular 的官網給出了父子組件之間數據交互的方法&#xff0c;如ViewChild、EventEmitter 但是如果要在同級組件之間進行數據同步&#xff0c;似乎并沒有給出太多的信息。 有時候我們想&#xff0c;在一個組件中修改數據之后&#xff0c;馬上反映到另外一個組件中&#xff0c; …

OpenCV里IplImage的widthStep參數 和width參數

一直以為IplImage結構體中的widthStep元素大小等于width*nChannels&#xff0c;大錯特錯&#xff01;&#xff08;為了快速訪問&#xff0c;要內存對齊啊&#xff09;查看OpenCV2.1的源碼&#xff0c;在src/cxcore/cxarray.cpp文件中&#xff0c;找到cvInitImageHeader函數&…