文章目錄
- 圖像掩膜操作
- 模糊原理
- 均值濾波
- 高斯濾波
- 中值濾波
- 雙邊濾波
- 算子
- 代碼
圖像掩膜操作
圖像掩膜操作
模糊原理
-
Smooth/Blur是圖像處理中最簡單和常用的操作之一
使用操作的原因之一就是為了給圖像預處理時候減低噪聲圖像噪聲是指存在于圖像數據中的不必要的或多余的干擾信息
-
Smooth/Blur操作原理是數學的卷積運算,根據不同卷積運算公式,劃分了多種圖像濾波方式
圖像濾波:指的是在盡量保留圖像特征的條件下對目標圖像得噪聲進行抑制
均值濾波
均值模糊無法克服邊緣像素信息丟失缺陷。原因是均值濾波是基于平均權重
6x6像素表中,3x3的卷積算子從圖一所示的紅色像素開始卷積,依次從左至右,從上至下。取黃色像素值之和的平均值賦給紅色像素,則紅色像素為卷積之后的新像素。由此每次移動一個像素。顯然,計算平均值時,取值范圍越大,"模糊效果"越強烈。
高斯濾波
高斯模糊部分克服了該缺陷,但是無法完全避免,因為沒有考慮像素值的不同
一階高斯算子
> 二階高斯算子
這9個點的權重總和等于0.4787147,如果只計算這9個點的加權平均,還必須讓它們的權重之和等于1,因此上面9個值還要分別除以0.4787147,得到最終的權重矩陣.
將這9個值加起來,就是中心點的高斯模糊的值。
對所有點重復這個過程,就得到了高斯模糊后的圖像。如果原圖是彩色圖片,可以對RGB三個通道分別做高斯模糊。
中值濾波
去除椒鹽噪聲
雙邊濾波
高斯雙邊模糊 – 是邊緣保留的濾波方法,避免了邊緣信息丟失,保留了圖像輪廓不變
雙邊濾波就是經典的常用的能夠保留圖像邊緣信息的濾波算法之一。雙邊濾波是一種綜合考慮濾波器內圖像空域信息和濾波器內圖像像素灰度值相似性的濾波算法,可以實現在保留區域信息的基礎上實現對噪聲的去除、對局部邊緣的平滑。雙邊濾波對高頻率的波動信號起到平滑的作用,同時保留大幅值的信號波動,進而實現對保留圖像中邊緣信息的作用。雙邊濾波器是兩個濾波器的結合,分別考慮空域信息和值域信息,使得濾波器對邊緣附近的像素進行濾波時,距離邊緣較遠的像素值不會對邊緣上的像素值影響太多,進而保留了邊緣的清晰性。
空域核:在窗口內每個位置都有權重(即每個位置的像素都考慮)。
i,j 為模板窗口的其他系數的坐標;k,l為模板窗口的中心坐標點;
σ為高斯函數的標準差。
w空間域核由像素位置歐式距離決定的模板權值
值域核:一定像素差范圍進行局部模糊,像素值高的在高的部分模糊,低的在低的那部分模糊,保留了邊緣區分
i ,j為模板窗口的其他系數的坐標,f(i,j)表示圖像在點i,j處的像素值;
k,l為模板窗口的中心坐標點,對應的像素值為f(k,l)
σ為高斯函數的標準差。
w值域核是由像素值的差值決定的模板權值
雙邊濾波器的模板權值
雙邊濾波器的數據公式
空域權重衡量的是 p,q兩點之間的距離,距離越遠權重越低
值域權重衡量的是 p,q兩點之間的像素值相似程度,越相似權重越大
算子
blur 算子
void blur( InputArray src, OutputArray dst,Size ksize, Point anchor = Point(-1,-1),int borderType = BORDER_DEFAULT );
/*******************************************************************
* src: 輸入圖像
* dst: 輸出圖像
* ksize: 內核大小
* anchor: 錨點
* 默認Point(-1,-1):錨點在核中心
* borderType: 外部像素邊界模式(一般不管)
*********************************************************************/
高斯算子
void GaussianBlur( InputArray src, OutputArray dst, Size ksize,double sigmaX, double sigmaY = 0,int borderType = BORDER_DEFAULT );
/*******************************************************************
* src: 輸入圖像
* dst: 輸出圖像
* ksize: 內核大小
* x,y必須是整數,并且為奇數
* sigmaX: X方向濾波系數
* sigmaY: Y方向濾波系數
* borderType: 外部像素邊界模式(一般不管)
*********************************************************************/
中值濾波
void medianBlur( InputArray src, OutputArray dst, int ksize );
/*******************************************************************
* src: 輸入圖像
* dst: 輸出圖像
* ksize: 內核大小
* 大小必須是大于1而且必須是奇數
*********************************************************************/
雙邊濾波
void bilateralFilter( InputArray src, OutputArray dst, int d,double sigmaColor, double sigmaSpace,int borderType = BORDER_DEFAULT );
/*******************************************************************
* src: 輸入圖像
* dst: 輸出圖像
* d: 濾波過程中每個像素鄰域的直徑
* sigmaColor: 顏色空間濾波器的標準差值
* 參數越大表明該像素領域內有越多的顏色被混合到一起
* sigmaSpace: 空間間坐標中濾波器的標準差值
* borderType: 外部像素邊界模式(一般不管)
*********************************************************************/
代碼
#include <iostream>
#include <string>
#include <map>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
class Blur
{
public:Blur() :img(imread("test.jpg")) {result["原圖"] = img;}void BlurByblur() {blur(img, result["blur"], Size(9, 9));}void BlurByGaussianBlur() {GaussianBlur(img, result["GaussianBlur"], Size(9, 9), 9, 9);}void BlurBymedianBlur() {medianBlur(img, result["medianBlur"], 9);}void BlurBybilateralFilter() {bilateralFilter(img, result["bilateralFilter"], 9, 9, 9);}void Show(){for (auto& v : result) {imshow(v.first, v.second);}waitKey(0);}
private:Mat img;map<string, Mat> result;
};
int main()
{Blur* p = new Blur;p->BlurByblur();p->BlurByGaussianBlur();p->BlurBymedianBlur();p->BlurBybilateralFilter();p->Show();return 0;
}