OpenCV 卷積運算和卷積核
卷積運算和卷積核
圖像運算中經常會碰到卷積運算這個講法, 初看不知道具體含義, 其實非常簡單, 工作原理如下:
- 首先提供一個小的矩陣, 一般是3*3, 或者是 5*5 或者是 7*7, 一般是方形矩陣, 維度為奇數, 這樣中心點可以作為錨點, 矩陣中的元素取值多為很小的整數(或正或負或零), 該矩陣被叫做 kernel 或卷積核.
- 圖像中每個點的最終取值, 需要和 kernel矩陣做個運算才能得到該點的最終取值, 計算過程為: 先將卷積核的錨點對中圖像上要計算的點, 這樣核矩陣和圖像上一小塊區域會重疊, 我們將重疊部分各個點做乘法運算, 并將乘積相加作為計算點的最終取值.
- 很顯然, 卷積運算其實就是對原圖像各點進行了加權平均, 卷積核上各點數值相當于權重, 一般圖像往往具備各方同性特征, 所以我們一般選擇核中心點作為錨點, 同時選擇奇數維度的矩陣, 這樣的矩陣中心點就非常明確.
卷積核的構建
OpenCV中的結構化元素專指數值為0和1的卷積核矩陣, 當然卷積核矩陣并不要要求數值一定是1或1.
- 手工構建: 卷積核就是個矩陣, 所以我們可以先創建一個Mat, 然后手工設定各位置取值就可以.
- 構建全為1元素的矩陣, 下面兩個寫法等價.
Mat element1 = Mat.Ones(3, 3, MatType.CV_8UC1);
Mat element2 = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(3, 3));
[ 1, 1, 1, 1, 1;
1, 1, 1, 1, 1;
1, 1, 1, 1, 1;
1, 1, 1, 1, 1;
1, 1, 1, 1, 1]
- 構建是十字線為1的矩陣, 其他元素都為0
Mat element3 = Cv2.GetStructuringElement(MorphShapes.Cross, new OpenCvSharp.Size(3, 3));
[ 0, 0, 1, 0, 0;
0, 0, 1, 0, 0;
1, 1, 1, 1, 1;
0, 0, 1, 0, 0;
0, 0, 1, 0, 0]
- 構建是橢圓形矩陣, 橢圓形區域內的元素為1, 其他元素都為0
Mat element4 = Cv2.GetStructuringElement(MorphShapes.Cross, new OpenCvSharp.Size(5, 5));
[ 0, 0, 1, 0, 0;
0, 0, 1, 0, 0;
1, 1, 1, 1, 1;
0, 0, 1, 0, 0;
0, 0, 1, 0, 0]
參考
https://zhuanlan.zhihu.com/p/273475106
https://blog.csdn.net/Vermont_/article/details/108424547

浙公網安備 33010602011771號