python-opencv在有噪音的情況下提取圖像的輪廓實例
對于一般的圖像提取輪廓,介紹了一個很好的方法,但是對于有噪聲的圖像,并不能很好地捕獲到目標(biāo)物體。
比如對于我的鼠標(biāo),提取的輪廓效果并不好,因為噪聲很多:

所以本文增加了去掉噪聲的部分。
首先加載原始圖像,并顯示圖像
img = cv2.imread("temp.jpg") #載入圖像
h, w = img.shape[:2] #獲取圖像的高和寬
cv2.imshow("Origin", img)

然后進(jìn)行低通濾波處理,進(jìn)行降噪
blured = cv2.blur(img,(5,5)) #進(jìn)行濾波去掉噪聲
cv2.imshow("Blur", blured) #顯示低通濾波后的圖像

使用floodfill來去掉目標(biāo)周圍的背景,泛洪填充類始于ps的魔棒工具,這里用來清除背景。

然后轉(zhuǎn)換成灰度圖
gray = cv2.cvtColor(blured,cv2.COLOR_BGR2GRAY)
cv2.imshow("gray", gray)

此時目標(biāo)圖像周圍有寫不光滑,還有一些噪聲,因此進(jìn)行開閉運(yùn)算,得到比較光滑的目標(biāo)
#定義結(jié)構(gòu)元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(50, 50))
#開閉運(yùn)算,先開運(yùn)算去除背景噪聲,再繼續(xù)閉運(yùn)算填充目標(biāo)內(nèi)的孔洞
opened = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel)
closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel)
cv2.imshow("closed", closed)

接著轉(zhuǎn)換成二值圖以便于獲取圖像的輪廓

最后進(jìn)行輪廓提取,抓取到目標(biāo)
#找到輪廓
_,contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#繪制輪廓
cv2.drawContours(img,contours,-1,(0,0,255),3)
#繪制結(jié)果
cv2.imshow("result", img)

全部代碼如下
#coding=utf-8
import cv2
import numpy as np
img = cv2.imread("temp.jpg") #載入圖像
h, w = img.shape[:2] #獲取圖像的高和寬
cv2.imshow("Origin", img) #顯示原始圖像
blured = cv2.blur(img,(5,5)) #進(jìn)行濾波去掉噪聲
cv2.imshow("Blur", blured) #顯示低通濾波后的圖像
mask = np.zeros((h+2, w+2), np.uint8) #掩碼長和寬都比輸入圖像多兩個像素點,滿水填充不會超出掩碼的非零邊緣
#進(jìn)行泛洪填充
cv2.floodFill(blured, mask, (w-1,h-1), (255,255,255), (2,2,2),(3,3,3),8)
cv2.imshow("floodfill", blured)
#得到灰度圖
gray = cv2.cvtColor(blured,cv2.COLOR_BGR2GRAY)
cv2.imshow("gray", gray)
#定義結(jié)構(gòu)元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(50, 50))
#開閉運(yùn)算,先開運(yùn)算去除背景噪聲,再繼續(xù)閉運(yùn)算填充目標(biāo)內(nèi)的孔洞
opened = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel)
closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel)
cv2.imshow("closed", closed)
#求二值圖
ret, binary = cv2.threshold(closed,250,255,cv2.THRESH_BINARY)
cv2.imshow("binary", binary)
#找到輪廓
_,contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#繪制輪廓
cv2.drawContours(img,contours,-1,(0,0,255),3)
#繪制結(jié)果
cv2.imshow("result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
以上這篇python-opencv在有噪音的情況下提取圖像的輪廓實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
探索Python元類與class語句協(xié)議掌握類的控制權(quán)
這篇文章主要介紹了通過Python元類與class語句協(xié)議掌握類的控制權(quán)探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Python中導(dǎo)入自定義模塊的幾種方法總結(jié)
這篇文章主要介紹了Python中導(dǎo)入自定義模塊的幾種方法總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01

