python-opencv在有噪音的情況下提取映像的輪廓

來源:互聯網
上載者:User

標籤:9.png   教程   很多   定義   jpg   結構   提取   image   opened   

  對於一般的映像提取輪廓,這篇博文介紹了一個很好的方法,但是對於有雜訊的映像,並不能很好地捕獲到目標物體。

  比如對於我的滑鼠,提取的輪廓效果並不好,因為雜訊很多:

  所以本文增加了去掉雜訊的部分。

  首先載入原始映像,並顯示映像

1 img = cv2.imread("temp.jpg")                #載入映像2 h, w = img.shape[:2]                        #擷取映像的高和寬  3 cv2.imshow("Origin", img)                   #顯示原始映像

 

  然後進行低通濾波處理,進行降噪

1 blured = cv2.blur(img,(5,5))                #進行濾波去掉雜訊2 cv2.imshow("Blur", blured)                  #顯示低通濾波後的映像

 

 

  使用floodfill來去掉目標周圍的背景,泛洪填充類始於ps的魔棒工具,這裡用來清除背景。

1 mask = np.zeros((h+2, w+2), np.uint8)       #掩碼長和寬都比輸入映像多兩個像素點,泛洪填充不會超出掩碼的非零邊緣  2 #進行泛洪填充3 cv2.floodFill(blured, mask, (w-1,h-1), (255,255,255), (2,2,2),(3,3,3),8)4 cv2.imshow("floodfill", blured)  

 

 

  然後轉換成灰階圖

1 gray = cv2.cvtColor(blured,cv2.COLOR_BGR2GRAY)  2 cv2.imshow("gray", gray)  

 

 

   此時靶心圖表像周圍有寫不光滑,還有一些雜訊,因此進行開閉運算,得到比較光滑的目標

1 #定義結構元素  2 kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(50, 50))3 #開閉運算,先開運算去除背景雜訊,再繼續閉運算填充目標內的孔洞4 opened = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel)  5 closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel)  6 cv2.imshow("closed", closed)  

 

  接著轉換成二值圖以便於擷取映像的輪廓

 

  最後進行輪廓提取,抓取到目標

1 #找到輪廓2 _,contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)  3 #繪製輪廓4 cv2.drawContours(img,contours,-1,(0,0,255),3)  5 #繪製結果6 cv2.imshow("result", img)

 

 

   全部代碼如下

 1 #coding=utf-8   2 import cv2   3 import numpy as np 4  5 img = cv2.imread("temp.jpg")                #載入映像 6 h, w = img.shape[:2]                        #擷取映像的高和寬   7 cv2.imshow("Origin", img)                   #顯示原始映像 8  9 blured = cv2.blur(img,(5,5))                #進行濾波去掉雜訊10 cv2.imshow("Blur", blured)                  #顯示低通濾波後的映像11 12 mask = np.zeros((h+2, w+2), np.uint8)       #掩碼長和寬都比輸入映像多兩個像素點,滿水填充不會超出掩碼的非零邊緣  13 #進行泛洪填充14 cv2.floodFill(blured, mask, (w-1,h-1), (255,255,255), (2,2,2),(3,3,3),8)15 cv2.imshow("floodfill", blured)  16 17 #得到灰階圖18 gray = cv2.cvtColor(blured,cv2.COLOR_BGR2GRAY)  19 cv2.imshow("gray", gray)  20 21 22 #定義結構元素  23 kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(50, 50))24 #開閉運算,先開運算去除背景雜訊,再繼續閉運算填充目標內的孔洞25 opened = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel)  26 closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel)  27 cv2.imshow("closed", closed)  28 29 #求二值圖30 ret, binary = cv2.threshold(closed,250,255,cv2.THRESH_BINARY)  31 cv2.imshow("binary", binary)  32 33 #找到輪廓34 _,contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)  35 #繪製輪廓36 37 cv2.drawContours(img,contours,-1,(0,0,255),3)  38 #繪製結果39 cv2.imshow("result", img)40 41 cv2.waitKey(0)  42 cv2.destroyAllWindows()  

 

python-opencv在有噪音的情況下提取映像的輪廓

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.