使用Python,OpenCV从图像中删除轮廓
生活随笔
收集整理的這篇文章主要介紹了
使用Python,OpenCV从图像中删除轮廓
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用Python,OpenCV從圖像中刪除輪廓
- 1. 效果圖
- 2. 步驟
- 3. 源碼
- 4. 參考
1. 使用Python、OpenCV計算輪廓的中心并標記
2. 使用Python、OpenCV檢測輪廓的形狀并標記
3. 使用顏色通道統計信息來標記形狀的實際顏色并標記
該博文可以看做是以上3篇的進階版,這篇博客將介紹從圖像中刪除指定的輪廓;
1. 效果圖
在保留矩形的同時刪除圓/橢圓,效果圖如下:
2. 步驟
從圖像中刪除輪廓的基本算法如下所示:
- 在圖像中檢測并找到輪廓;
- 分別在輪廓上循環;
- 確定輪廓是否需要刪除,并應根據一些標準刪除;
- 累積一個個需要被刪除的輪廓的遮罩Mask;
- 使用按位“與”將累積的不良輪廓遮罩應用于原始圖像。
算法本身非常簡單,需要注意和考慮的主要是步驟3,確定是否應該刪除輪廓。
3. 源碼
# USAGE
# python remove_contours.py# 導入必要的包
import numpy as np
import imutils
import cv2# 在保留矩形的同時刪除圓/橢圓,矩形有四條邊。圓沒有邊。
# 如果近似有4個點(頂點),則輪廓將保持不變,表示輪廓是矩形。
def is_contour_bad(c):# 近似輪廓peri = cv2.arcLength(c, True)approx = cv2.approxPolyDP(c, 0.02 * peri, True)# 如果不是矩形則認為是bad輪廓,需要刪除return not len(approx) == 4# 加載圖形圖像,將其轉換為灰度,并檢測邊緣
image = cv2.imread("shapes.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edged = cv2.Canny(gray, 50, 100)
cv2.imshow("Original", image)# 尋找輪廓,并初始化要刪除的輪廓mask
cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts) #兼容不同opencv版本獲取輪廓
mask = np.ones(image.shape[:2], dtype="uint8") * 255 #初始化一個mask# 遍歷輪廓
for c in cnts:# 如果輪廓需要刪除,則繪制在mask上以累積輪廓if is_contour_bad(c):cv2.drawContours(mask, [c], -1, 0, -1)# 在圖像上移除輪廓,并展示結果圖像
# 注意輪廓是如何在白色背景上顯示為黑色形狀的。這是因為當應用cv2.bitwise功能時,原始圖像的白色區域將被mask中的黑色區域替換。
image = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow("Mask", mask)
cv2.imshow("After", image)
cv2.waitKey(0)
4. 參考
- https://www.pyimagesearch.com/2015/02/09/removing-contours-image-using-python-opencv/
總結
以上是生活随笔為你收集整理的使用Python,OpenCV从图像中删除轮廓的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Python和OpenCV构建图像金
- 下一篇: 使用Python、OpenCV进行图像接