簡體   English   中英

如何從圖像中提取垂直和水平線

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM