OpenCV3入門(七)圖像形態學

一、膨脹

所謂的圖片的膨脹處理,其實就是在圖像的邊緣添加像素值,使得總體的像素值擴張,進而達到圖像的膨脹效果。html

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

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

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

函數原型:oop

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表示卷積核spa

anchor是point類型,表示錨的位置,默認正中心code

iterations表示迭代次數htm

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); 

二、腐蝕

腐蝕:就是求局部最小值的操做。

結構元素(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);

三、開運算和閉運算

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)時測試以下。

四、形態學梯度

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

能夠表示爲:

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

五、頂帽和黑帽

1)頂帽(Top Hat):

又稱「禮帽」運算,原圖像與開運算圖的差,突出原圖像中比周圍亮的區域。

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

2)黑帽(Black Hat):

閉操做圖像減去原圖像,突出原圖像中比周圍暗的區域。

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

六、高斯金字塔

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

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);

上採樣結果。

下采樣結果。

七、參考文獻

一、《OpenCV3 編程入門》,電子工業出版社,毛星雨著

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

三、圖像金字塔(高斯金字塔、拉普拉斯金字塔)

http://www.javashuo.com/article/p-bwkkqknc-ee.html

四、圖像金字塔

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

五、Image Pyramids

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

六、Image Pyramids

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

 

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

http://www.javashuo.com/article/p-fhmptgqr-he.html

相關文章
相關標籤/搜索