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