open cv常見運算元與自定義線性濾波

2021-10-05 16:21:47 字數 4063 閱讀 7955

卷積和卷積如何工作,這個是知道的,卷積的作用就是模糊影象

提取邊緣,銳化影象。常見的卷積核(運算元)有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運算元被用來尋找梯度 尋找影象的邊緣 和掩膜...