[英]How to extract vertical and horizontal lines from the image
任務:
我有一組圖像,其中每個圖像看起來像這樣:
我想從此圖像中提取所有水平線和所有垂直線。
期望的結果:
目前的做法:
import cv2
image = cv2.imread('img.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3, 3), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (20, 1))
horizontal = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=1)
結果如下:
問題:
很明顯,當前的 kernel 太窄,無法繞過左邊這條粗豎線。 這條線是 41 像素厚,所以 kernel (42, 1) 工作正常,但我失去了小於 41 像素的真正水平線:
有沒有完美的技術來解決這個問題?
這個想法是在應用形態過濾器之前通過骨架化將所有這些線帶至相同的“大小”並使用較小的過濾器大小
image = cv2.imread('Your_ImagePath' , cv2.IMREAD_COLOR)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
thresh = skeletonize(thresh)
cv2.imshow("Skelton",thresh)
cv2.waitKey()
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 1))
horizontal = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel,
iterations=1)
cv2.imshow("Horizontal Lines" , horizontal)
v2.waitKey()
OUTPUT 圖片:
注意:skeletonize.py 中的骨架化代碼
我會考慮用一個又高又薄的結構元素(即一條 15 像素高和 1 像素寬的垂直線)來尋找垂直條,並用一條 15 像素長和 1 像素高的水平線來尋找水平條。
你可以用OpenCV做同樣的事情。 但我只是在終端中使用ImageMagick執行此操作,因為我更快:這是垂直工作的命令 - 嘗試改變 15 以獲得不同的結果:
magick shapes.png -morphology open rectangle:1x15 result.png
這是 animation 的結果如何隨着您改變 15(線的長度)而變化:
這是將結構元素設為水平線時的外觀:
magick shapes.png -morphology open rectangle:15x1 result.png
如果您不熟悉形態學,這里有 Anthony Thyssen 的精彩描述。 請注意,它可以用ImageMagick來解釋,但這些原理同樣適用於 Python OpenCV - 請參見此處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.