我試圖從源影像中檢測區域何時有一些“漏洞”以及它們位于何處。源影像可以是隨機的,并且有 1 個以上的孔。

我想用我的代碼找到紅色圓圈區域,但我不知道從哪里開始。
我沒有看到任何功能可以幫助我解決這個問題。我認為 drawContours 在那里不會有幫助(對于獲得這些“區域”已經很有用)
有人在 Python 中看到了一種方法嗎?(也許不使用 openCV,我對任何免費庫開放)
謝謝 !
uj5u.com熱心網友回復:
一種可能的方法是提取最大的輪廓(這是影像中最大的“路徑”),過濾標準也可能涉及直接獲取最外層的輪廓。然后,檢查不連續點,即路徑的端點。您實際上是在要求大量代碼。幸運的是,我開發了一個類似的演算法。有兩個步驟:
- 找到最大的輪廓/斑點/路徑
- 找到路徑的端點。
讓我們看看代碼:
# Imports
import cv2
import numpy as np
fileName = "shape01.png"
path = "D://opencvImages//"
# Reading an image in default mode:
inputImage = cv2.imread(path fileName)
# Prepare a deep copy of the input for results:
inputImageCopy = inputImage.copy()
# Grayscale conversion:
grayscaleImage = cv2.cvtColor(inputImage, cv2.COLOR_BGR2GRAY)
# Threshold via Otsu:
_, binaryImage = cv2.threshold(grayscaleImage, 0, 255, cv2.THRESH_BINARY_INV cv2.THRESH_OTSU)
# Find the biggest blob:
binaryImage = findBiggestBlob(binaryImage)
第一步涉及計算輸入的二進制影像。然后,從那里提取最大的輪廓。我實作了一個名為 的函式findBiggestBlob,它僅使用其面積計算影像上最大的 blob。它回傳隔離的最大 blob 的影像;這來自我寫的相同想法的
隔離小地圖并找到輸出。一些過濾:
def highlightWalls(image):
img_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
hsv_color3 = np.asarray([18, 98, 80])
hsv_color4 = np.asarray([28, 125, 137])
hsv_color5 = np.asarray([9, 0, 57])
hsv_color6 = np.asarray([71, 29, 134])
kernel = np.ones((3, 3))
mask1 = cv2.inRange(img_hsv, hsv_color3,hsv_color4)
mask2 = cv2.inRange(img_hsv, hsv_color5,hsv_color6)
mask = cv2.bitwise_xor(mask1, mask2)
blur = cv2.bilateralFilter(image,9,75,75)
image1= cv2.bitwise_and(blur,blur,mask=mask)
cv2.imshow("iamge1", image1)
finalMinimap = cv2.Canny(image1, 150, 200, None, 3)
img_dilate = cv2.dilate(finalMinimap, kernel, iterations=3)
cv2.imshow("walls", img_dilate)
return img_dilate
給出:

骨架現在給出:

現在干得好!但我錯過了最后一步:移除骨架的所有小“分支”。如果不 :

那里的老板有什么想法嗎?PS:如果你有一些想法可以更好地過濾我的第一張圖片,當然讓我知道!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/387284.html
