1. 程式人生 > >OpenCV3入門(七)影象形態學

OpenCV3入門(七)影象形態學

1、膨脹

所謂的圖片的膨脹處理,其實就是在影象的邊緣新增畫素值,使得整體的畫素值擴張,進而達到影象的膨脹效果。

對Z2上元素集合A和結構體元素S,使用S對A進行腐蝕,記作:

A⊕S={z|(S)z ∩ A ≠ Ø}

讓位於影象圓點的結構元素S在Z平面上移動,如果S的圓點移動到z點時,S與A有公共的交集(非空集),則認為這樣的z點構成的集合是S對A的膨脹影象。

函式原型:

CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,
                          Point anchor = Point(-1,-1), int iterations = 1,
                          int borderType = BORDER_CONSTANT,
                          const Scalar& borderValue = morphologyDefaultBorderValue() );

dst表示處理的結果

src表示原影象

kernel表示卷積核

anchor是point型別,表示錨的位置,預設正中心

iterations表示迭代次數

borderType邊緣的模糊方式

一般需要前三個引數即可,第三個引數需要用getStructuringElement函式確定,該函式確定模板核心特性和錨點的位置。

CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

模板核心的型別有:

MORPH_RECT:矩形

MORPH_CROSS:交叉型

MORPH_ELLIPSE:橢圓型

示例如下。

img = imread("D:\\WORK\\5.OpenCV\\LeanOpenCV\\pic_src\\pic7.bmp");

img1 = img.clone();
imshow("原圖", img);
Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
dilate(img, img2, element);
imshow("膨脹", img2); 

2、腐蝕

腐蝕:就是求區域性最小值的操作。

結構元素(Sturcture Element),形象稱呼刷子,在每個畫素位置上與二值影象對應的區域進行特定的邏輯運算。運算結構是輸出影象的相應畫素。運算效果取決於結構元素大小內容以及邏輯運算性質。

對Z2上元素集合A和結構體元素S,使用S對A進行腐蝕,記作:

AΘS={z|(S)z € A}

讓位於影象圓點的結構元素S在Z平面上移動,如果S的圓點移動到z點時,S能夠完全的包含於A中,則認為這樣的z點構成的集合是S對A的腐蝕影象。

函式原型:

CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,
                         Point anchor = Point(-1,-1), int iterations = 1,
                         int borderType = BORDER_CONSTANT,
                         const Scalar& borderValue = morphologyDefaultBorderValue() );

示例如下。

img = imread("D:\\WORK\\5.OpenCV\\LeanOpenCV\\pic_src\\pic7.bmp");

img1 = img.clone();
imshow("原圖", img);
Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
erode(img, img2, element);
imshow("腐蝕", img2);

3、開運算和閉運算

1)開運算就是先腐蝕後膨脹的過程,可以表示為:

dst = open(src, element)

dst = dilate(erode(dst, element))

作用:用來消除小的物體,平滑形狀邊界,並且不改變其面積。可以去除小顆粒噪聲,斷開物體之間的粘連。

2)閉運算是先膨脹後腐蝕的過程,可以表示為:

dst = close(src, element)

dst = erode(dilate (dst, element))

作用:用來填充物體內的小空洞,連線鄰近的物體,連線斷開的輪廓線,平滑其邊界的同時不改變面積。

函式原型:

CV_EXPORTS_W void morphologyEx( InputArray src, OutputArray dst,
                                int op, InputArray kernel,
                                Point anchor = Point(-1,-1), int iterations = 1,
                                int borderType = BORDER_CONSTANT,
                                const Scalar& borderValue = morphologyDefaultBorderValue() );

其中第三個引數op代表形態學運算的型別,具體如下表。

img = imread("D:\\WORK\\5.OpenCV\\LeanOpenCV\\pic_src\\pic7.bmp");

img1 = img.clone();
imshow("原圖", img);
Mat element = getStructuringElement(MORPH_RECT, Size(7, 7));
morphologyEx(img, img2, MORPH_OPEN, element);
imshow("開運算", img2);
morphologyEx(img, img3, MORPH_CLOSE, element);
imshow("閉運算", img3);

核心模板大小為Size(3,3)時測試如下圖,開運算因為先做了腐蝕所以圖片上的小白點都消失了。而閉運算因為先膨脹,所以小白點被放大了,再次腐蝕後也留了下來,並且有多個小白點連在了一起。此外閉運算圖中細菌出現了互相連線的邊緣,開運算細菌邊緣間隔更加清晰。

核心模板大小為Size(7,7)時測試如下。

4、形態學梯度

形態學梯度就是膨脹圖與腐蝕圖之差,梯度從原區域的膨脹中減去了原區域的收縮,保留了影象的外邊緣部分,也就是影象的輪廓。

可以表示為:

dst = morpd_grad(src, element) = dilate (src, element) - erode(src, element)

5、頂帽和黑帽

1)頂帽(Top Hat):

又稱“禮帽”運算,原影象與開運算圖的差,突出原影象中比周圍亮的區域。

因為開運算放大了裂縫或者區域性低亮度的區域,再從原圖中減去開運算後的圖,就保留了比原圖輪廓周圍的區域更明亮的區域。頂帽運算往往用來分離比鄰近點亮一些的斑塊。當一幅影象具有大幅的背景的時候,而微小物品比較有規律的情況下,可以使用頂帽運算進行背景提取。

2)黑帽(Black Hat):

閉操作影象減去原影象,突出原影象中比周圍暗的區域。

黑帽運算後的效果圖突出了比原圖輪廓周圍的區域更暗的區域,此外黑帽還能得到影象內部的小孔,或者前景色中的小黑點。

6、高斯金字塔

影象金字塔是影象中多尺度表達的一種,最初用於機器視覺和影象壓縮,金字塔的底部是高解析度的影象,而頂部是低解析度的近似,當向金字塔的上層移動時,尺寸和解析度降低,伴隨的細節就越少。低解析度的影象主要用於分析大的結構或影象的整體內容,高解析度影象適合分析單個物體的特性。

1)下采樣:就是圖片縮小,使用PryDown函式,先高斯模糊,再降取樣。下采樣將步驟:先對影象進行高斯核心卷積,再將所有偶數行和列去除,影象縮小到原來四分之一,迭代上述步驟就得到的金字塔。

2)上取樣:就是圖片放大,使用PryUp函式。先將影象在每個方向擴大為原來的兩倍,新增的行和列以0填充,再卷積得到放大後的影象。

函式原型為:

CV_EXPORTS_W void pyrUp( InputArray src, OutputArray dst,
                         const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );
CV_EXPORTS_W void pyrDown( InputArray src, OutputArray dst,
                          const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );

示例如下。

img = imread("D:\\WORK\\5.OpenCV\\LeanOpenCV\\pic_src\\pic5.bmp");
imshow("原圖", img);
pyrDown(img, img2, Size(img.cols * 2, img.rows * 2));
imshow("上取樣運算1", img2);
pyrDown(img2, img3, Size(img2.cols * 2, img2.rows * 2));
imshow("上取樣運算2", img3);

上取樣結果。

下采樣結果。

7、參考文獻

1、《OpenCV3 程式設計入門》,電子工業出版社,毛星雨著

2、《學習OpenCV》,清華大學出版社,Gary Bradski, Adrian kaehler著

3、影象金字塔(高斯金字塔、拉普拉斯金字塔)

https://www.cnblogs.com/sddai/p/10330756.html

4、影象金字塔

https://www.kancloud.cn/aollo/aolloopencv/272073

5、Image Pyramids

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_pyramids/py_pyramids.html

6、Image Pyramids

https://docs.opencv.org/2.4/doc/tutorials/imgproc/pyramids/pyramids.html

 

 尊重原創技術文章,轉載請註明。

https://www.cnblogs.com/pingwen/p/12319629.html