原理
歸一化塊濾波器 (Normalized Box Filter)
高斯濾波器 (Gaussian Filter)
中值濾波器 (Median Filter)
中值濾波將影象的每個畫素用鄰域 (以當前畫素為中心的正方形區域)畫素的中值代替 。
雙邊濾波 (Bilateral Filter)
目前我們瞭解的濾波器都是為了平滑影象, 問題是有些時候這些濾波器不僅僅削弱了噪聲, 連帶著把邊緣也給磨掉了。 為避免這樣的情形 (至少在一定程度上 ), 我們可以使用雙邊濾波。
類似於高斯濾波器,雙邊濾波器也給每一個鄰域畫素分配一個加權係數。 這些加權係數包含兩個部分, 第一部分加權方式與高斯濾波一樣,第二部分的權重則取決於該鄰域畫素與當前畫素的灰度差值。
函式介紹:
(1)均值平滑函式(均值濾波器)(blur)(所有畫素加權係數相等)
blur(InputArraysrc, // 輸入影象
OutputArray dst, // 輸出影象
Size ksize, // Size(w,h ): 定義核心大小(w畫素寬度, h 畫素高度)
Point anchor = Point(-1,-1), // Point(-1,-1): 指定錨點位置(被平滑點), 如果是負值,取核的中心為錨點
int borderType = BORDER_DEFAULT); // 可省略不寫
(2)高斯平滑函式(高斯濾波器)(GaussianBlur)(中間畫素的加權係數是最大的, 周邊畫素的加權係數隨著它們遠離中間畫素的距離增大而逐漸減小。)
GaussianBlur(InputArray src,// 輸入影象
OutputArray dst,// 輸出影象
Size ksize,// Size( w,h ): 定義核心大小( w 畫素寬度, h 畫素高度)
double sigmaX,// x 方向標準方差
double sigmaY =0,// y 方向標準方差
int borderType = BORDER_DEFAULT)
(3)中值平滑函式(中值濾波器)(medianBlur)(中值濾波將影象的每個畫素用鄰域 (以當前畫素為中心的正方形區域)畫素的中值代替。)
medianBlur(InputArray src,// 輸入影象
OutputArray dst,// 輸出影象
int ksize)// 核心大小 (只需一個值,因為我們使用正方形視窗),必須為奇數。
程式碼實現
全域性變數
Mat src;
Mat dst;
int MAX_KERNEL_LENGTH = 20;
點選btn實現不同效果的轉換(按鈕是通過storyboard建立的,通過tag值來區分)
- (IBAction)changeType:(id)sender {
UIButton *btn = (UIButton *)sender;
switch (btn.tag) {
case 1000:// 展示原圖
{
self.secondImageView.image = MatToUIImage(src);
}
break;
case 1001:// 均值
{
for (int i = 1; i < MAX_KERNEL_LENGTH; i+=2) {
blur(src, dst, cv::Size(i,i));
}
self.secondImageView.image = MatToUIImage(dst);
}
break;
case 1002:// 高斯模糊
{
for (int i = 1; i < MAX_KERNEL_LENGTH; i+=2) {
GaussianBlur(src, dst, cv::Size(i,i),0);
}
self.secondImageView.image = MatToUIImage(dst);
}
break;
case 1003:// 中值
{
for (int i = 1; i < MAX_KERNEL_LENGTH; i+=2) {
medianBlur(src, dst, i);
}
self.secondImageView.image = MatToUIImage(dst);
}
break;
default:
break;
}
}
效果
原圖
模糊效果(其中一種)
參考資料