《OpenCV3编程入门》学习笔记6 图像处理(二)非线性滤波:中值滤波、双边滤波
第6章 圖像處理
6.2 非線性濾波:中值濾波、雙邊濾波
6.2.1 非線性濾波
很多情況下,使用領域像素的非線性濾波會得到更好的效果,如在噪聲是散粒噪聲而不是高斯噪聲,即圖像偶爾會出現很大值時,高斯濾波效果不如中值濾波
6.2.2 中值濾波(medianBlur)
1.濾波原理:基于排序統計理論的一種能有效抑制噪聲的非線性信號處理技術,用像素點鄰域灰度值的中值替代像素點的灰度值,讓周圍的像素值接近真實值,從而消除孤立的噪聲點,該方法在去除脈沖噪聲、斑點噪聲(speckle noise)、椒鹽噪聲(salt-and-pepper noise)的同時又能保留圖像的邊緣細節。
2.優點:在均值濾波中,由于噪聲成份被放入平均計算中,所以輸出受到了影響,但在中值濾波中,由于噪聲成分很難選上,所以幾乎不會影響輸出。可克服線性濾波的細節模糊。
3.缺點:中值濾波是均值濾波的5倍以上時間,且不適合細節多的圖像
4.取3*3函數窗,計算以點[i,j]為中心的函數窗像素中值,步驟:
(1)按強度值大小排列像素點
(2)選擇排序像素集的中間值作為點[i,j]的值
5.封裝函數:medianBlur函數
6.函數原型:
void medianBlur(InputArray src,OutputArray dst,int ksize)
7.參數說明:
(1)Mat類型輸入圖像(1/3/4通道),ksize為3或5時,圖像深度應為CV_8U、CV_16U、CV_32F之一
(2)目標圖像,與輸入圖像尺寸類型一致,可用srcImage.clone()初始化目標圖像
(3)ksize,孔徑的線性尺寸(aperture linear size),必須是大于1的奇數
6.2.3 雙邊濾波(bilateralFilter)
1.雙邊濾波:一種非線性濾波方法,圖像的空間鄰近度和像素值相似度的折中,同時考慮空域信息和灰度相似性,達到保邊去噪的目的,具有簡單、非迭代、局部特點
2.優點:基于空間分布的高斯濾波函數,較遠像素不會太影響邊緣像素,保證了邊緣保存(edge-preserving)
3.缺點:由于保存了過多高頻信息,對彩色圖像里的高頻噪聲不能很好過濾,只能對低頻信息較好濾波
4.濾波原理:輸出像素依賴于鄰域像素值的加權值組合:
????????????????
加權系數w(i,j,k,l)取決于定義域核和值域核乘積
定義域核:
????????????????
值域核:
????????????????
???????????
兩者相乘后,會產生依賴于數據的雙邊濾波權重函數
????????????
5.封裝函數:bilateralFilter函數
6.函數原型:
void bilateralFilter(InputArray src,OutputArray dst,int d,double sigmaColor,double simgmaSpace,int borderType=BORDER_DEFAULT)
7.參數說明:
(1)輸入圖像,8位或浮點型單通道、三通道圖像
(2)目標圖像,與輸入圖像尺寸類型一致
(3)過濾過程中每個像素鄰域的直徑,為非正數時,從參數sigmaSpace計算它
(4)顏色空間濾波器的sigma值,值越大表明像素鄰域內有越寬廣的顏色會被混合到一起,產生較大的半相等顏色區域
(5)坐標空間中濾波器的sigma值,坐標空間的標注方差,值越大,表明越遠的像素會相互影響,使更大的區域中足夠相似的顏色獲取相同顏色。d>0時,d指定了領域大小且與sigmaSpace無關,否則d正比于sigmaSpace
(6)用于推斷圖像外部像素的某種邊界模式
6.2.4 非線性濾波示例
1.兩種非線性濾波
#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;int main()
{//載入原圖Mat srcImage = imread("love.jpg");//顯示原圖namedWindow("中值濾波【原圖】");imshow("中值濾波【原圖】", srcImage);//中值濾波Mat dstImage1;medianBlur(srcImage, dstImage1, 7);namedWindow("中值濾波【效果圖】");imshow("中值濾波【效果圖】", dstImage1);//雙邊濾波Mat dstImage2;bilateralFilter(srcImage, dstImage2, 25, 25 * 2, 25 / 2);namedWindow("雙邊濾波【效果圖】");imshow("雙邊濾波【效果圖】", dstImage2);waitKey(0);return 0;
}
2.滑動條控制濾波模糊度
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//全局變量
Mat g_srcImage, g_dstImage1, g_dstImage2;
int g_nMedianBlurValue;
int g_nBilateralFilterValue;//全局函數
static void on_MedianBlur(int, void*);
static void on_BilateralFilter(int, void*);int main()
{//改變控制臺字體顏色system("color 5E");//載入原圖g_srcImage = imread("love.jpg");if (!g_srcImage.data){printf("載入原圖像失敗~!\n");return false;}//復制原圖到目標圖像g_dstImage1 = g_srcImage.clone();g_dstImage2 = g_srcImage.clone();//初始化內核值g_nMedianBlurValue = 7;g_nBilateralFilterValue = 10;//顯示原圖namedWindow("非線性濾波【原圖】",1);imshow("非線性濾波【原圖】", g_srcImage);//========================【<1>中值濾波】=======================//創建窗口namedWindow("中值濾波【效果圖】",1);//創建滑動條createTrackbar("內核值:", "中值濾波【效果圖】", &g_nMedianBlurValue, 50, on_MedianBlur);on_MedianBlur(g_nMedianBlurValue, 0);//===============================================================//========================【<2>雙邊濾波】========================//創建窗口namedWindow("雙邊濾波【效果圖】",1);//創建滑動條createTrackbar("內核值:", "雙邊濾波【效果圖】", &g_nBilateralFilterValue, 50, on_BilateralFilter);on_BilateralFilter(g_nBilateralFilterValue, 0);//===============================================================waitKey(0);return 0;
}
static void on_MedianBlur(int, void*)
{medianBlur(g_srcImage, g_dstImage1, g_nMedianBlurValue*2+1);imshow("中值濾波【效果圖】", g_dstImage1);
}
static void on_BilateralFilter(int, void*)
{bilateralFilter(g_srcImage, g_dstImage2, g_nBilateralFilterValue, g_nBilateralFilterValue * 2, g_nBilateralFilterValue / 2);imshow("雙邊濾波【效果圖】", g_dstImage2);
}
總結
以上是生活随笔為你收集整理的《OpenCV3编程入门》学习笔记6 图像处理(二)非线性滤波:中值滤波、双边滤波的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样给感情保鲜--各路大神支招?
- 下一篇: 大数加法【HDU 1002】