卷積和卷積如何工作,這個是知道的,卷積的作用就是模糊影象
提取邊緣,銳化影象。常見的卷積核(運算元)有robert運算元,
sobel運算元,拉普拉斯運算元,前兩個運算元是分x方向和y方向的,
而拉普拉斯運算元是提取整體影象的邊緣。
卷積概念
●卷積是影象處理中乙個操作 ,是kermel(卷積核)在影象的每個畫素
上的操作。
●kermel(卷積核)本質 上是乙個固定大小的巨陣陣列,其中心點稱為錨
點(anchorpoint)
卷積如何工作
●把kernel卷積核放到畫素陣列之 上,求錨點周圍覆蓋的像索乘
積之和(包括錨點) ,用來替換錨點覆蓋下畫素點值
稱為卷積處理
從左到右 從上到下
8 6 6
2 8 6
2 2 8
處理之前的畫素值
設定的卷積和大小為
1 1 1
1 1 1
1 1 1
根據公式計算 sum=8x1+6x1+6x1+2x1+8x1+6x1+2x1+2x1+8x1
錨點 8 的替換值為 sum/(m*n) 卷積乘積和除以陣列的大(寬高) =48/9=5.3;
卷積也稱為 運算元
常見運算元
robert運算元(2x2) 梯度運算元
x方向 y方向
sobel運算元(3x3)
水平方向(左右差異化) 上下方向
-1 0 1 -1 -2 -1
-2 0 2 0 0 0
-1 0 1 1 2 1
拉普拉斯運算元(3x3)
拉普拉斯運算元得到的是整個的運算元 全域性運算元 不區分xy方向
0 -1 0
-1 4 -1
0 -1 0
用來尋找輪廓 尋找影象的邊緣
自定義卷積模糊(線性濾波)
filter2d(mat src, mat dst, int depth, mat kernel, point anchor, double delta);
matst, 輸入影象
matdst,模糊影象
int depth, 影象深度32/8
matkernel, 卷積核模板
point anchor, 錨點位置
double delta 計算出來的畫素delta
其中kernel是可以自定義的卷積核
#include
#include
#include
#include
using
namespace cv;
using
namespace std;
mat src,dst;
mat kernel;
intmain()
imshow
("原圖"
, src)
;//robert運算元 x方向
//kernel = (mat_(2, 2) << 1, 0,
// 0, -1);
//robert運算元 y方向
//kernel = (mat_(2, 2) << 0, 1,
// -1, 0);
//robert運算元 xy方向的差異得到了最大的體現 混合xy方向處理後的影象就可以得到輪廓
/* //sobel運算元 x方向 重點突出左右差異(左右邊界會很明顯)
kernel = (mat_(3, 3) << -1, 0, 1,
-2, 0, 2,
-1, 0, 1);
*//*
//sobel運算元 y方向 重點突出上下差異(上下邊界會很明顯)
kernel = (mat_(3, 3) << -1,-2,-1,
0, 0, 0,
1, 2, 1);
*///拉普拉斯運算元 邊緣檢測運算元 整體運算元
kernel =
(mat_<
int>(3
,3)<<0,
-1,0
,-1,
4,-1
,0,-
1,0)
;//銳化運算元
/* kernel = (mat_(3, 3) << 0, -1, 0,
-1, 5, -1,
0, -1, 0);
*///filter2d(src, dst, src.depth(), kernel, point(-1, -1), 0.0);
//imshow("運算元型別", dst);
//自定義卷積模糊
int c =0;
int index =0;
int ksize =3;
//漸進模糊
while
(true
)//死迴圈
//按下esc(esc的ascll**為27)鍵退出 因為此時 c的值就是 waitkey的值 waitkey收到了27這個返回值 就出發break 跳出此迴圈
// if (waitkey(500)== 'q') //與上面同理
ksize =4+
(index%5)
*2+1
;//ksize = index * 2 + 1;//一直模糊下去
//使得卷積模板尺寸最小為5*5,最大為13*13
//可以通過改寫除數(5)來獲得不同範圍的模板尺寸變化
//mat kernel = mat::ones(src.size(), src.type());//生成乙個和原圖完全一直的圖
mat kernel = mat::
ones
(size
(ksize, ksize)
, cv_32f)/(
float
)(ksize * ksize)
;// size(ksize, ksize)是自定義影象ones的卷積核大小
//cv_32f 是自定義影象ones的型別為32為浮點型-src.type()
//把ksize*ksize尺寸的模板每一位都賦值為1然後除模板尺寸
//(卷積的工作原理(new pixel=sum/(m*n))用於後續做均值模糊
//卷積的工作原理 卷積核錨點依次與模板內各個陣列相乘 乘積相加後
//得到 sum sum除以卷積模板的大小 的結果 替換原錨點的數值 使得模板內數值平均 達到模糊效果
filter2d
(src, dst,-1
, kernel)
; index++
;imshow
("自定義卷積模糊"
,dst);}
waitkey(0
);return0;
}
ksize = 4+(index%5)*2+1;
因為1小於5
所以:1÷5=0.......1
1除以5商是0,餘數是1
5%5為0
所以可以實現重複模糊
filter2d(mat src, mat dst, int depth, mat kernel, point anchor, double delta);
matst, 輸入影象
matdst,模糊影象
int depth, 影象深度32/8
matkernel, 卷積核模板
point anchor, 錨點位置
double delta 計算出來的畫素delta
其中kernel是可以自定義的卷積核
mat::ones()
mat m = mat::ones(2, 2, cv_8uc3); 相當於:mat m = mat(2, 2, cv_8uc3, 1);
/opencv replaces 1 with scalar(1,0,0)相當於每個畫素的第乙個通道為1,其餘兩個通道為0;
mat::zeros()
mat m = mat::zeros(2, 2, cv_8uc3);
//相當於建立一張黑色的圖,每個畫素的每個通道都為0,scalar(0,0,0);
opencv自定義卷積核
include opencv2 imgproc imgproc.hpp include opencv2 highgui highgui.hpp using namespace cv mat get blur kernel int kernel size 獲得歸一化濾波的卷積核 int main in...
opencv 自定義線性濾波
卷積概念 卷積是影象處理的乙個操作,是依據kernel對影象每個畫素點進行操作,kernel本質上是乙個固定大小的矩陣陣列,其中心為錨點。把kernel放在畫素的陣列之上,求錨點周圍覆蓋的畫素乘積之和 包括錨點 用其來替換錨點下的畫素值。稱之為卷積操作。公式如圖所示。依次對影象進行該操作。常見運算元...
opencv 自定義線性濾波
自定義線性濾波 效果 在學習自定義線性濾波前,需要了解卷積的相關概念 影象中的卷積 最常見的運算元 在邊緣檢測中經常用到,是canny邊緣檢測中重要的一步,通過sobel運算元得到梯度 銳化的掩膜中間是5,拉普拉斯運算元中間是4 拉普拉斯運算元和sobel運算元被用來尋找梯度 尋找影象的邊緣 和掩膜...