iOS使用OpenCV之濾波處理(三)

前言

  • 這篇文章咱們來介紹濾波處理,

理論

平滑/模糊(Smooth/Blur)是圖像處理中最簡單和經常使用的操做,能夠給圖像預處理時候下降噪聲。
圖像平滑處理每每使圖像中的邊界、輪廓變得模糊,緣由是由於圖像受到了平均或積分運算,從頻率域來考慮,圖像模糊的實質是由於其高頻份量被衰減git

image.png
f(i,j)表示一幅圖像,第i行j列的像素,h(k,l)是卷積核/卷積算子,k l大小又叫窗口大小,在k l範圍內f(i,j)與h(k,l)乘積,各值相加獲得一新像素值,輸出圖像g(i,j)github

WeChata7bb18facd4f5d48864f773fe7a9ff34.png 卷積過程:6x6上面是個3x3的窗口,從左向右,從上向下移動,黃色的每一個像個像素點值之和取平均值賦給中心紅色像素做爲它卷積處理以後新的像素值。每次移動一個像素格。算法

濾波處理分爲兩大類:線性濾波和非線性濾波markdown

  • 線性濾波:方框濾波、均值濾波、高斯濾波
  • 非線性濾波:中值濾波、雙邊濾波

均值模糊

均值濾波的缺點就是不能很好地保護細節,在圖像去燥的同時也破壞了圖像的而細節部分,從而使圖像變得模糊,不能很好的去除噪點。oop

/* 模糊處理 */
- (UIImage*)kj_opencvBlurX:(int)x y:(int)y{
    cv::Mat src,dst;
    UIImageToMat(self,src,true);
    //均值濾波處理
    blur(src, dst, cv::Size(x,y));
    return kMatToUIImage(dst);
}
複製代碼

高斯模糊

高斯濾波,能夠消除高斯噪聲,普遍應用於圖像處理的減噪過程。
高斯濾波處理,Size高斯內核大小必須爲正奇數post

/* 高斯模糊,xy須要正數且爲奇數 */
- (UIImage*)kj_opencvGaussianBlurX:(int)x y:(int)y{
    cv::Mat src,dst;
    UIImageToMat(self,src,true);
    //高斯濾波處理,Size高斯內核大小必須爲正奇數
    GaussianBlur(src, dst, cv::Size(x,y), 0);
    return kMatToUIImage(dst);
}
複製代碼

中值模糊

基本思想就是用像素點的領域灰度的中值來代替該像素點的灰度值,該方法在去除脈衝噪聲、椒鹽噪聲的同時又能保留圖像的細節(不會出現邊緣模糊的狀況)
中值濾波跟均值濾波的思想看起來很類似,只是一個取平均值,一個取中位數而已spa

/* 中值模糊,能夠去掉白色小顆粒,ksize必須爲正數且奇數 */
- (UIImage*)kj_opencvMedianBlurksize:(int)ksize{
    cv::Mat src,dst;
    UIImageToMat(self,src,true);
    //中值濾波主要處理椒鹽小顆粒
    medianBlur(src, dst, ksize);
    return kMatToUIImage(dst);
}
複製代碼

高斯雙邊模糊

雙邊濾波的最大特色就是作邊緣保存,能夠作磨皮美白效果
雙邊濾波器能夠很好的保存圖像邊緣細節而濾除掉低頻份量的噪音,sigma<10則對濾波器影響很小,若是sigma>150則會對濾波器產生較大的影響,會使圖片看起來像卡通3d

/* 高斯雙邊模糊,能夠作磨皮美白效果 */
- (UIImage*)kj_opencvBilateralFilterBlurRadio:(int)radio sigma:(int)sigma{
    cv::Mat src,dst;
    UIImageToMat(self,src,true);
    src = kFourChannelsBecomeThree(src);
    //雙邊濾波器能夠很好的保存圖像邊緣細節而濾除掉低頻份量的噪音,
    //sigma<10,則對濾波器影響很小,若是sigma>150則會對濾波器產生較大的影響,會使圖片看起來像卡通
    //圖像必須是8位或浮點型單通道、三通道的圖像
    bilateralFilter(src, dst, radio, sigma, 5);
    
    dst = kPromoteImageContrast(dst);
    return kMatToUIImage(dst);
}
複製代碼

綜合對比,雙邊濾波是全部濾波中最清晰的code

自定義線性模糊

filter2D自定義卷積核,而後達到模糊效果orm

/* 自定義線性模糊 */
- (UIImage*)kj_opencvCustomBlurksize:(int)ksize{
    cv::Mat src,dst;
    UIImageToMat(self,src,true);
    if (!(ksize%2)) ksize++;//保證爲奇數
    Mat kernel = Mat::ones(cv::Size(ksize,ksize), CV_32F/(float)(ksize*ksize));
    filter2D(src, dst, -1, kernel);
    return kMatToUIImage(dst);
}
複製代碼

效果圖

高斯雙邊模糊效果:

系列文章關聯

一、如何在 iOS 工程中使用 OpenCV
二、iOS使用OpenCV之調整圖片亮度和對比度(一)
三、iOS使用OpenCV之圖像融合(二)
四、iOS使用OpenCV之濾波處理(三)

接下來我會慢慢補充Opencv的相關文章,暫時已將常見的圖片處理和圖片算法封裝出來,有須要的朋友能夠去pod 'KJExtensionHandler/Opencv'

如何在 iOS 工程中使用 OpenCV介紹就到此完畢,後面有相關再補充,寫文章不容易,還請點個**小星星**傳送門

相關文章
相關標籤/搜索