我正試圖從我的canny邊緣檢測中過濾掉短線。以下是我目前使用的方法以及簡單的解釋:
我首先從影像的單通道開始,運行CV2的Canny邊緣檢測。
我首先從影像的單通道開始,運行CV2的Canny邊緣檢測。之后,我掃描每個像素,檢測其周圍是否有白色(True,255)的像素。如果是,我就把它加到一組真實像素中,然后檢查它周圍的每個像素(一直回圈到沒有白色/真實像素為止。然后,如果組數小于指定的閾值(在本例中,100個像素),我將所有像素替換為黑色/假。
雖然這個方法有效(如下圖所示),但它非常慢。我想知道是否有一個更快、更簡單的方法來實作這個目標。
import cv2
img = cv2.imread("edtest.jpg"/span>)
img_r = img.copy()
img_r[:, :, 0] = 0。
img_r[:, :, 1] = 0
img_r = cv2.GaussianBlur(img_r, (3, 3), 0)
basic_edge = cv2.Canny(img_r, 240, 250)
culled_edge = basic_edge.copy()
min_threshold = 100 for x in range(len(culled_edge))。
print(x)
for y in range(len(culled_edge[x]) ):
test_pixels = [(x, y)
true_pixels=[(x, y)]
while len(test_pixels) != 0:
xorigin = test_pixels[0] [0]
yorigin = test_pixels[0][1]
if 0 < xorigin < len(culled_edge) - 1 and 0 < yorigin < len(culled_edge[0]) - 1:
for testx in range(3)。
for testy in range(3)。
if culled_edge[xorigin-1 testx][yorigin - 1 testy] == 255 and (xorigin-1 testx, yorigin-1 testy) not in true_pixels:
test_pixels.append((xorigin-1 testx, yorigin-1 testy)
true_pixels.append((xorigin-1 testx, yorigin-1 testy)
test_pixels.pop(0)
if 1 < len(true_pixels) < min_threshold:
for i in range(len(true_pixels))。
culled_edge[true_pixels[i][0]][true_pixels[i][1]] =0。
cv2.imshow("basic_edge"/span>, basic_edge)
cv2.imshow("culled_edge", culled_edge)
cv2.waitKey(0)
源影像:
uj5u.com熱心網友回復:
你所應用的操作被稱為區域開放。我認為OpenCV中沒有實作,但你可以在scikit-image(skimage.morphology.area_opening)或DIPlib(dip.BinaryAreaOpening)找到一個。
例如,使用DIPlib(披露:我是作者),你要修改你的代碼如下:
import diplib as dip
# ...
basic_edge = cv2.Canny(img_r, 240, 250)
min_threshold = 100 100
culled_edge = dip.BinaryAreaOpening(basic_edge > 0, min_threshold)
輸出,culled_edge,現在是一個dip.Image物件,它與NumPy陣列兼容,你應該能夠在許多情況下這樣使用它。如果有問題,那么你可以用culled_edge = np.array(culled_edge)將其投回NumPy陣列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/320330.html
標籤:
上一篇:洗掉所有具有全零鄰居的像素


