文章目錄
- 模糊原理
- 具體卷積計算程序
- 模糊分類
- 歸一化盒子濾波(均值濾波)
- 高斯濾波
- 代碼示例
模糊原理
Smooth/Blur(平滑和模糊) 是影像處理中最簡單和常用的操作之一,
使用該操作的原因之一就是為了給影像預處理時候降低噪聲,把噪聲與周圍的數值平均一下就可以平滑噪聲,
使用Smooth/Blur操作背后是數學的卷積計算,下面我們先來看一下卷積計算相關的知識:
卷積:通過兩個函式f 和g 生成第三個函式的一種數學算子,表征函式f 與g經過翻轉和平移的重疊部分的面積,
計算公式為:

其中:f()表示一副影像,i、j表示影像的行和列,h(k,l)表示卷積算子(卷積核)(也可以叫掩膜),k,l又可以叫視窗大小(掩膜的大小,比如3*3),g()表示輸出的像素值;f()的第一行,第一列資料不要,邊緣像素怎么處理后續會有介紹
通常這些卷積算子計算都是線性操作,所以又叫線性濾波
如下圖:假設有6x6的影像像素點矩陣(灰色) ,黃色3x3是卷積算子
卷積程序:6x6上面有個3x3的視窗,這個3x3的視窗從左向右,從上向下移動
黃色的卷積算子乘以影像對應的像素點后,將得到的像素點值加在一起,取平均值賦給中心紅色像素,作為卷積處理后的新的像素值

更形象的卷積程序如下面gif所示:

具體卷積計算程序
假設有一個卷積核(卷積算子)h,就一般為33的矩陣:

有一個待處理矩陣x:

hx的計算程序分為三步
第一步,將卷積核翻轉180°,也就是成為了

第二步,將卷積核h的中心對準x的第一個元素,然后對應元素相乘后相加,沒有元素的地方補0,

這樣結果Y中的第一個元素值Y11=10+20+10+00+01+02±10±25±1*6=-16
第三步每個元素都像這樣計算出來就可以得到一個輸出矩陣,就是卷積結果

以此類推的計算每個元素,
最后結果為:

模糊分類
歸一化盒子濾波(均值濾波)
歸一化盒子濾波(均值濾波): 就是上面的卷積計算,卷積算子(掩膜)中的格子權重都是1,所以卷積和之后還要除以卷積因子的大小取均值
公式

用到的API:
blur(
Mat src,
Mat dst,
Size(xradius, yradius),
Point(-1,-1)
);
高斯濾波
高斯濾波: 相比于均值濾波,權重是不一樣,但是權重和為1,所以計算卷積和之后不用取均值了,
公式:

用到API:
void GaussianBlur(
InputArray src,
OutputArray dst,
Size ksize,
double sigmaX,
double sigmaY = 0
);
代碼示例

#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>
using namespace cv;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("./test2.jpg");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
char input_title[] = "input image";
char output_title[] = "blur image";
namedWindow(input_title, CV_WINDOW_AUTOSIZE);
namedWindow(output_title, CV_WINDOW_AUTOSIZE);
imshow(input_title, src);
blur(src, dst, Size(11, 11), Point(-1, -1));
imshow(output_title, dst);
Mat gblur;
GaussianBlur(src, gblur, Size(11, 11), 11, 11);
imshow("gaussian blur", gblur);
waitKey(0);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/355429.html
標籤:其他
