OpenCV(iOS)平滑處理(模糊,毛玻璃)(10)

一個蘿蔔壹個坑發表於2018-01-03

原理

OpenCV(iOS)平滑處理(模糊,毛玻璃)(10)

歸一化塊濾波器 (Normalized Box Filter)

OpenCV(iOS)平滑處理(模糊,毛玻璃)(10)

高斯濾波器 (Gaussian Filter)

OpenCV(iOS)平滑處理(模糊,毛玻璃)(10)

中值濾波器 (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;

}

}

效果

原圖

OpenCV(iOS)平滑處理(模糊,毛玻璃)(10)

模糊效果(其中一種)

OpenCV(iOS)平滑處理(模糊,毛玻璃)(10)

參考資料

OpenCV for iOS 學習筆記(九)—— 影象毛玻璃處理

影象平滑處理

相關文章