1. 程式人生 > >C++ Opencv——影象處理——濾波

C++ Opencv——影象處理——濾波

https://blog.csdn.net/zoucharming/article/details/70197863

在影象處理中,儘可能消除圖片中的噪聲,消除噪聲就需要用到濾波,在本次opencv學習中,學習了三個濾波方式。

(1)平均濾波,就是將一個區域內的畫素值求和取平均值,然後用這個平均值替換區域中心的畫素值。

blur(源Mat物件,目標Mat物件,Size物件,Point物件)//Size物件用來確定區域大小,Point物件如果x,y都是-1則表示更新區域中心的畫素。

(2)高斯濾波,也是將一個區域的畫素值求取平均值替換區域中心的畫素值,但是是加權平均,權重按照二維正態分佈。

GaussianBlur(源Mat物件,目標Mat物件,Size物件,x方向正太分佈引數,y方向正太分佈引數)

(3)中值濾波,之前的兩個濾波都有個問題,如果區域中有極端值,很可能影響濾波效果,中值濾波採用區域中的中值來替換,有利於克服椒鹽噪聲。

medianBlur(源Mat物件,目標Mat物件,int size)//這裡的size表示正方形區域的邊長

(4)雙邊濾波,之前的濾波還有個問題,他們都會把輪廓給模糊了,有一些區域之間相差較大的畫素,這往往能看出輪廓,所以如果我們給個限制範圍,如果兩點間的畫素值差距大於這個範圍就不濾波了,保留影象輪廓

bilateralFilter(源Mat物件,目標Mat物件,int 區域半徑,int 限制範圍,int space)//space是當區域半徑給的是0時,用來計算區域範圍的,一般情況下沒用,隨便給個數就行。
 

#include<opencv2\opencv.hpp>
#include<iostream>
#include<math.h>
#include<algorithm>
 
using namespace std;
using namespace cv;
 
int main()
{
	Mat src;
	src = imread("1.jpg", 1);
	if (src.empty())
	{
		printf("cannot load!!\n");
		return -1;
	}
	namedWindow("原圖");
	imshow("原圖", src);
	Mat dst,dst1;
	blur(src, dst, Size(3, 3), Point(-1, -1));
	namedWindow("均值濾波");
	imshow("均值濾波", dst);
	GaussianBlur(src, dst, Size(5, 5), 5, 5);
	namedWindow("高斯濾波");
	imshow("高斯濾波", dst);
	medianBlur(src, dst, 5);
	namedWindow("中值濾波");
	imshow("中值濾波", dst);
	bilateralFilter(src, dst, 5, 100, 3);
	namedWindow("雙邊濾波");
	imshow("雙邊濾波", dst);
 
	waitKey(0);
 
	return 0;
}

雙邊濾波效果最好,既保留了輪廓,面板更加平滑,如果再用掩膜提高下對比度,就可以進行修圖了。