日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

opencv4 c++ 提取图片中的白色区域_【从零学习OpenCV 4】形态学应用

發布時間:2025/3/21 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv4 c++ 提取图片中的白色区域_【从零学习OpenCV 4】形态学应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文首發于“小白學視覺”微信公眾號,歡迎關注公眾號

本文作者為小白,版權歸人民郵電出版社發行所有,禁止轉載,侵權必究!


經過幾個月的努力,小白終于完成了市面上第一本OpenCV 4入門書籍《OpenCV 4開發詳解》。為了更讓小伙伴更早的了解最新版的OpenCV 4,小白與出版社溝通,提前在公眾號上連載部分內容,請持續關注小白。

圖像形態學腐蝕可以將細小的噪聲區域去除,但是會將圖像主要區域的面積縮小,造成主要區域的形狀發生改變;圖像形態學膨脹可以擴充每一個區域的面積,填充較小的空洞,但是同樣會增加噪聲的面積。根據兩者的特性將圖像腐蝕和膨脹適當的結合,便可以既去除圖像中的噪聲,又不縮小圖像中主要區域的面積;既填充了較小的空洞,又不增加噪聲所占的面積。因此,本節中將介紹如何利用不同順序的圖像腐蝕和膨脹實現圖像的開運算、閉運算、形態學梯度、頂帽運算、黑帽運算以及擊中擊不中變換等操作。

開運算

圖像開運算可以去除圖像中的噪聲,消除較小連通域,保留較大連通域,同時能夠在兩個物體纖細的連接處將兩個物體分離,并且在不明顯改變較大連通域的面積的同時能夠平滑連通域的邊界。開運算是圖像腐蝕和膨脹操作的結合,首先對圖像進行腐蝕,消除圖像中的噪聲和較小的連通域,之后通過膨脹運算彌補較大連通域因腐蝕而造成的面積減小。圖6-22給出了圖像開運算的三個階段,圖6-22中左側圖像是待開運算的原圖像,中間的圖像是利用3×3矩形結構元素對原圖像進行腐蝕后的圖像,通過結果可以看到較小的連通域已經被去除,但是較大的連通域也在邊界區域產生了較大的面積縮減,之后對腐蝕后的圖像進行膨脹運算,得到圖6-22中右側圖像。通過結果可以看出,膨脹運算彌補了腐蝕運算造成的邊界面積縮減,使得開運算的結果只去除了較小的連通域,保留了較大的連通域。

圖6-22 圖像開運算三個階段

開運算是對圖像腐蝕和膨脹的組合,OpenCV 4沒有提供只用于圖像開運算的函數,而是提供了圖像腐蝕和膨脹運算不同組合形式的morphologyEx()函數,以實現圖像的開運算、閉運算、形態學提取、頂帽運算、黑帽運算以及擊中擊不中變換,該函數的函數原型在代碼清單6-15中給出。

代碼清單6-15 morphologyEx()函數原型 1. void cv::morphologyEx(InputArray src, 2. OutputArray dst, 3. int op, 4. InputArray kernel, 5. Point anchor = Point(-1,-1), 6. int iterations = 1, 7. int borderType = BORDER_CONSTANT, 8. const Scalar & borderValue = morphologyDefaultBorderValue() 9. )
  • src:輸入圖像,圖像的通道數可以是任意的,但是圖像的數據類型必須是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
  • dst:形態學操作后的輸出圖像,與輸入圖像具有相同的尺寸和數據類型。
  • op:形態學操作類型的標志,可以選擇的標志及含義在表6-6中給出。
  • kernel:結構元素,可以自己生成,也可以用getStructuringElement()函數生成。
  • anchor:中心點在結構元素中的位置,默認參數為結構元素的幾何中心點
  • iterations:處理的次數
  • borderType:像素外推法選擇標志,取值范圍在表3-5中給出。默認參數為BORDER_DEFAULT,表示不包含邊界值倒序填充。
  • borderValue:使用邊界不變外推法時的邊界值。

該函數根據結構元素對輸入圖像進行多種形態學操作,在處理多通道圖像時每個通道獨立進行處理。函數的第一個參數為待形態學處理的圖像,圖像通道數可以是任意的,但是圖像的數據類型必須是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。函數第二個參數為形態學處理后的輸出圖像,與輸入圖像具有相同的尺寸和數據類型。函數第三個參數是形態學操作類型的選擇標志,可以選擇的形態學操作類型有開運算、閉運算、形態學梯度、頂帽運算、黑帽運算以及擊中擊不中變換,詳細的參數在表6-6給出。函數第四個和第五個參數都是與結構元素相關的參數,第四個參數為結構元素,使用的結構元素尺寸越大效果越明顯,第四個參數為結構元素的中心位置,第五個參數的默認值為Point(-1,-1),表示結構元素的幾何中心處為結構元素的中心點。函數第六個參數是使用結構元素處理的次數,處理次數越多效果越明顯。函數第七個參數是圖像像素外推法的選擇標志,第八個參數為使用邊界不變外推法時的邊界值,這兩個參數對圖像中主要部分的形態學操作沒有影響,因此在多數情況下使用默認值即可。

表6-6 morphologyEX()函數中形態學操作類型標志可選參數及含義

該函數實現了多種形態學操作,對于函數的使用方法將在介紹該函數涉及到的所有形態學操作相關概念后在代碼清單6-16中給出。

閉運算

圖像閉運算可以去除連通域內的小型空洞,平滑物體輪廓,連接兩個臨近的連通域。開運算是圖像腐蝕和膨脹操作的結合,首先對圖像進行膨脹,填充連通域內的小型空洞,擴大連通域的邊界,將臨近的兩個連通域連接,之后通過腐蝕運算減少由膨脹運算引起的連通域邊界的擴大以及面積的增加。圖6-23給出了圖像閉運算的三個階段,圖6-23中左側圖像是待閉運算的原圖像,中間的圖像是利用3×3矩形結構元素對原圖像進行膨脹后的圖像,通過結果可以看到較大連通域內的小型空洞已經被填充,同時臨近的兩個連通域也連接了在一起,但是連通域的邊界明顯擴張,整體的面積增加,之后對膨脹后的圖像進行腐蝕運算,得到圖6-22中右側圖像。通過結果可以看出,腐蝕運算能夠消除連通域因膨脹運算帶來的面積增長,但是圖像中依然存在較大的面積增長,主要是因為連通域膨脹后,有較大區域在圖像的邊緣區域,而圖像邊緣區域的形態學操作結果與圖像的邊緣外推方法有著密切的關系,因此采用默認外推方法時,邊緣的連通域不會被腐蝕掉,從而產生圖6-23右側的結果。

圖6-23 圖像閉運算三個階段

閉運算是對圖像膨脹和腐蝕的組合,OpenCV 4提供的morphologyEx()函數可以選擇閉運算參數MORPH_CLOSE實現圖像的閉運算,該函數的函數原型已經在代碼清單6-15中給出,函數的使用方式將在介紹該函數涉及到的所有形態學操作相關概念后在代碼清單6-16中給出。

形態學梯度

形態學梯度能夠描述目標的邊界,根據圖像腐蝕和膨脹與原圖之間的關系計算得到,形態學梯度可以分為基本梯度、內部梯度和外部梯度。基本梯度是原圖像膨脹后圖像和腐蝕后圖像間的差值圖像,內部梯度圖像是原圖像和腐蝕后圖像間的差值圖像,外部梯度是膨脹后圖像和原圖像間的差值圖像。圖6-24給出了計算形態學基本梯度的三個階段,圖6-24中左側圖像是原圖像利用3×3矩形結構元素進行膨脹后的圖像,中間的圖像是原圖像利用3×3矩形結構元素進行腐蝕后的圖像,右側圖像是左側圖像和中間圖像的差值。

圖6-24 形態學梯度計算的三個階段

OpenCV 4提供的morphologyEx()函數可以選擇閉運算參數MORPH_GRADIENT實現圖像的基本梯度,如果需要計算圖像的內部梯度或者外部梯度,需要自己通過程序實現。morphologyEx()函數的函數原型已經在代碼清單6-15中給出,函數的使用方式將在介紹該函數涉及到的所有形態學操作相關概念后在代碼清單6-16中給出。

頂帽運算

圖像頂帽運算是原圖像與開運算結果之間的差值,往往用來分離比鄰近點亮一些的斑塊,因為開運算帶來的結果是放大了裂縫或者局部低亮度的區域,因此,從原圖中減去開運算后的圖,得到的效果圖突出了比原圖輪廓周圍的區域更明亮的區域。頂帽運算先對圖像進行開運算,之后從原圖像中減去開運算計算的結果,在圖6-25中給出了計算頂帽運算的三個階段,圖6-25中左側圖像是原圖像,中間的圖像是利用3×3矩形結構元素對原圖像進行開運算后的圖像,右側圖像是左側原與中間開運算結果圖像之間的差值,即為原圖像頂帽運算的結果。

圖6-25 圖像頂帽運算的三個階段

OpenCV 4提供的morphologyEx()函數可以選擇頂帽運算的參數MORPH_TOPHAT實現圖像的閉運算,該函數的函數原型已經在代碼清單6-15中給出,函數的使用方式將在介紹該函數涉及到的所有形態學操作相關概念后在代碼清單6-16中給出。

黑帽運算

圖像黑帽運算是與圖像頂帽運算相對應的形態學操作,與頂帽運算相反,黑帽運算是原圖像與閉運算結果之間的差值,往往用來分離比鄰近點暗一些的斑塊。頂帽運算先對圖像進行開運算,之后從原圖像中減去開運算計算的結果,在圖6-26中給出了計算頂帽運算的三個階段,圖6-26中左側圖像是利用3×3矩形結構元素對原圖像進行閉運算后的圖像,中間的圖像是原圖像,右側圖像是左側閉運算結果圖像與中間原圖像之間的差值,即為原圖像黑帽運算的結果。

圖6-26 圖像黑帽運算的三個階段

OpenCV 4提供的morphologyEx()函數可以選擇黑帽運算的參數MORPH_BLACKHAT實現圖像的閉運算,該函數的函數原型已經在代碼清單6-15中給出,函數的使用方式將在介紹該函數涉及到的所有形態學操作相關概念后在代碼清單6-16中給出。

擊中擊不中變換

擊中擊不中變換是比圖像腐蝕要求更加苛刻的一種形態學操作,圖像腐蝕只需要圖像能夠將結構元素中所有非0元素包含即可,但是擊中擊不中變換要求原圖像中需要存在與結構元素一模一樣的結構,即結構元素中非0元素也需要同時被考慮。如圖6-27中所示,如果用中間的結構元素對左側圖像進行腐蝕,那么將會得到圖6-24中所示的腐蝕計算結果,而用中間結構元素對左側圖像進行擊中擊不中變換結果為圖6-27右側所示,因為結構元素的中心位置為0,而在原圖像中符合這種結構的位置只在圖像中的中心處,因此擊中擊不中變換的結果與圖像腐蝕結果具有極大的差異。但是在使用矩形結構元素時,擊中擊不中變換與圖像的腐蝕結果相同。

圖6-27 圖像擊中擊不中變換結果

OpenCV 4提供的morphologyEx()函數可以選擇擊中擊不中變換參數MORPH_HITMISS實現圖像的擊中擊不中變換,該函數的函數原型已經在代碼清單6-15中給出,函數的使用方式在介紹該函數涉及到的所有形態學操作相關概念后在代碼清單6-16中給出。程序中構建了用于介紹形態學多種操作原理的原圖像,之后用3×3矩形結構元素分別對原圖像進行開運算、閉運算、形態學梯度、頂帽運算、黑帽運算以及擊中擊不中變換等操作,驗證morphologyEx()函數處理結果與理論處理結果是否相同,處理結果在圖6-28給出。其中需要注意的是由于進行擊中擊不中變換使用的結構元素與原理介紹時不同,因此程序中的擊中擊不中變換結果與圖6-27不同。此外,為了驗證多種形態學操作處理圖像的效果,程序中讀取一張灰度圖像,對圖像進行二值化后分別進行多種形態學操作,灰度圖像和二值化后的圖像如圖6-29所示,形態學操作處理后的圖像在圖6-30給出。

代碼清單6-16 myMorphologyApp.cpp形態學操作應用 1. #include <opencv2opencv.hpp> 2. #include <iostream> 3. #include <vector> 4. 5. using namespace cv; 6. using namespace std; 7. 8. int main() 9. { 10. //用于驗證形態學應用的二值化矩陣 11. Mat src = (Mat_<uchar>(9, 12) << 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12. 0, 255, 255, 255, 255, 255, 255, 255, 0, 0, 255, 0, 13. 0, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 14. 0, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 15. 0, 255, 255, 255, 0, 255, 255, 255, 0, 0, 0, 0, 16. 0, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 17. 0, 255, 255, 255, 255, 255, 255, 255, 0, 0, 255, 0, 18. 0, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 19. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 20. namedWindow("src", WINDOW_NORMAL); //可以自由調節顯示圖像的尺寸 21. imshow("src", src); 22. //3×3矩形結構元素 23. Mat kernel = getStructuringElement(0, Size(3, 3)); 24. 25. //對二值化矩陣進行形態學操作 26. Mat open, close,gradient,tophat,blackhat,hitmiss; 27. 28. //對二值化矩陣進行開運算 29. morphologyEx(src, open, MORPH_OPEN, kernel); 30. namedWindow("open", WINDOW_NORMAL); //可以自由調節顯示圖像的尺寸 31. imshow("open", open); 32. 33. //對二值化矩陣進行閉運算 34. morphologyEx(src, close, MORPH_CLOSE, kernel); 35. namedWindow("close", WINDOW_NORMAL); //可以自由調節顯示圖像的尺寸 36. imshow("close", close); 37. 38. //對二值化矩陣進行梯度運算 39. morphologyEx(src, gradient, MORPH_GRADIENT, kernel); 40. namedWindow("gradient", WINDOW_NORMAL); //可以自由調節顯示圖像的尺寸 41. imshow("gradient", gradient); 42. 43. //對二值化矩陣進行頂帽運算 44. morphologyEx(src, tophat, MORPH_TOPHAT, kernel); 45. namedWindow("tophat", WINDOW_NORMAL); //可以自由調節顯示圖像的尺寸 46. imshow("tophat", tophat); 47. 48. //對二值化矩陣進行黑帽運算 49. morphologyEx(src, blackhat, MORPH_BLACKHAT, kernel); 50. namedWindow("blackhat", WINDOW_NORMAL); //可以自由調節顯示圖像的尺寸 51. imshow("blackhat", blackhat); 52. 53. //對二值化矩陣進行擊中擊不中變換 54. morphologyEx(src, hitmiss, MORPH_HITMISS, kernel); 55. namedWindow("hitmiss", WINDOW_NORMAL); //可以自由調節顯示圖像的尺寸 56. imshow("hitmiss", hitmiss); 57. 58. //用圖像驗證形態學操作效果 59. Mat coin = imread("coin.png",IMREAD_GRAYSCALE); 60. imshow("coin", coin); 61. threshold(coin, coin, 130, 255, THRESH_BINARY); 62. imshow("二值化后的coin", coin); 63. 64. //5×5矩形結構元素 65. Mat kernel_coin = getStructuringElement(0, Size(5, 5)); 66. Mat open_coin, close_coin, gradient_coin; 67. Mat tophat_coin, blackhat_coin, hitmiss_coin; 68. 69. //對圖像進行開運算 70. morphologyEx(coin, open_coin, MORPH_OPEN, kernel_coin); 71. imshow("open_coin", open_coin); 72. 73. //對圖像進行閉運算 74. morphologyEx(coin, close_coin, MORPH_CLOSE, kernel_coin); 75. imshow("close_coin", close_coin); 76. 77. //對圖像進行梯度運算 78. morphologyEx(coin, gradient_coin, MORPH_GRADIENT, kernel_coin); 79. imshow("gradient_coin", gradient_coin); 80. 81. //對圖像進行頂帽運算 82. morphologyEx(coin, tophat_coin, MORPH_TOPHAT, kernel_coin); 83. imshow("tophat_coin", tophat_coin); 84. 85. //對圖像進行黑帽運算 86. morphologyEx(coin, blackhat_coin, MORPH_BLACKHAT, kernel_coin); 87. imshow("blackhat_coin", blackhat_coin); 88. 89. //對圖像進行擊中擊不中變換 90. morphologyEx(coin, hitmiss_coin, MORPH_HITMISS, kernel_coin); 91. imshow("hitmiss_coin", hitmiss_coin); 92. 93. waitKey(0); 94. return 0; 95. }

圖6-28 myMorphologyApp.cpp程序中驗證形態學操作的處理結果

圖6-29 myMorphologyApp.cpp程序中灰度圖像及二值化后的圖像

圖6-30 myMorphologyApp.cpp程序中圖像形態學操作后的結果

經過幾個月的努力,市面上第一本OpenCV 4入門書籍《OpenCV 4開發詳解》將春節后由人民郵電出版社發行。如果小伙伴覺得內容有幫助,希望到時候多多支持!

關注小白的小伙伴可以提前看到書中的內容,我們創建了學習交流群,歡迎各位小伙伴添加小白微信加入交流群,添加小白時請備注“學習OpenCV 4”。

https://u.wechat.com/MJ-57nVtXgxUyL3dTwWd014 (二維碼自動識別)

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的opencv4 c++ 提取图片中的白色区域_【从零学习OpenCV 4】形态学应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。