改进水平线检测的 HoughLines (Python, OpenCV)
Improve HoughLines for horizontal lines detect (Python, OpenCV)
我有这张源图片:
我的目标是移除底线,同时保持 letters/numbers 不变。
这是我使用的代码:
import cv2
import numpy as np
img = cv2.imread('src.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,100,200,apertureSize = 5)
minLineLength = 0
maxLineGap = 19
lines = cv2.HoughLinesP(edges,1,np.pi/180,15,minLineLength,maxLineGap)
for x in range(0, len(lines)):
for x1,y1,x2,y2 in lines[x]:
cv2.line(img,(x1,y1),(x2,y2),(255,255,255),2)
cv2.imshow('hough',img)
cv2.waitKey(0)
我目前最好的成绩是这样的:
如何改进它,尽可能清洁图像?
例如,图像周围的所有碎片,文字下方的点和(静止)线,我该如何去除它们?
谢谢。
OT:有没有办法创建一个跟踪条来改变参数(apertureSize、minLineLength、maxLineGap 等)以实时查看结果?
一旦你从 Hough 得到线段,你就可以搜索它们以找到可能是底线的一部分(即正确的角度和截距),然后沿着这条预测线删除所有黑点,而不仅仅是线段由霍夫发现。
另一个提示,尝试 cv::adaptivethreshold 而不是精明,先尝试进行小的高斯模糊以去除背景斑点。
编辑:您正在使用 HoughP 单独查找每个留置权段。您正在寻找一条(断线)线,因此使用常规 Hough 可能会更好,并且从结果 select 图像下半部分最强的水平线 - 然后擦除沿该方向的所有点。
ot:cv::namedWindow 可以有一个 trackbar,您可以在其中轻松取回值
根据@Link 的要求:
我在 python 方面的经验有限,所以我不知道这段代码的线程安全性如何,但这应该向您展示了在 python OpenCV 中创建轨迹栏的基础知识。
def onChange(pos):
global img
global gray
global dst
dst = np.copy(img)
apertureSize = cv2.getTrackbarPos("ApertureSize", "Result")
minLineLength = cv2.getTrackbarPos("LineLength", "Result")
maxLineGap = cv2.getTrackbarPos("LineGap", "Result")
# according to OpenCV, aperture size must be odd and between 3 and 7
if apertureSize % 2 == 0:
apertureSize += 1
if apertureSize < 3:
apertureSize = 3
edges = cv2.Canny(gray,100,200,apertureSize = apertureSize)
lines = cv2.HoughLinesP(edges,1,np.pi/180,15,minLineLength,maxLineGap)
for x in range(0, len(lines)):
for x1,y1,x2,y2 in lines[x]:
cv2.line(dst,(x1,y1),(x2,y2),(255,255,255),2)
#Run Main
if __name__ == "__main__" :
img = cv2.imread("image.png", -1)
dst = np.copy(img)
cv2.namedWindow("Result", cv2.WINDOW_NORMAL)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#default values for trackbars
defaultApertureSize = 5
minLineLength = 0
maxLineGap = 19
# according to OpenCV, aperture size must be odd and between 3 and 7
# the aperture size range is (0 - 6)
cv2.createTrackbar("ApertureSize", "Result", defaultApertureSize, 6, onChange)
# line length range is (0 - 10)
cv2.createTrackbar("LineLength", "Result", minLineLength, 10, onChange)
# line gap range is (0 - 19)
cv2.createTrackbar("LineGap", "Result", maxLineGap, 19, onChange)
while True:
cv2.imshow("Result", dst)
key = cv2.waitKey(1)
if key == ord('q'):
break
cv2.destroyAllWindows()
我有这张源图片:
我的目标是移除底线,同时保持 letters/numbers 不变。
这是我使用的代码:
import cv2
import numpy as np
img = cv2.imread('src.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,100,200,apertureSize = 5)
minLineLength = 0
maxLineGap = 19
lines = cv2.HoughLinesP(edges,1,np.pi/180,15,minLineLength,maxLineGap)
for x in range(0, len(lines)):
for x1,y1,x2,y2 in lines[x]:
cv2.line(img,(x1,y1),(x2,y2),(255,255,255),2)
cv2.imshow('hough',img)
cv2.waitKey(0)
我目前最好的成绩是这样的:
如何改进它,尽可能清洁图像? 例如,图像周围的所有碎片,文字下方的点和(静止)线,我该如何去除它们?
谢谢。
OT:有没有办法创建一个跟踪条来改变参数(apertureSize、minLineLength、maxLineGap 等)以实时查看结果?
一旦你从 Hough 得到线段,你就可以搜索它们以找到可能是底线的一部分(即正确的角度和截距),然后沿着这条预测线删除所有黑点,而不仅仅是线段由霍夫发现。
另一个提示,尝试 cv::adaptivethreshold 而不是精明,先尝试进行小的高斯模糊以去除背景斑点。
编辑:您正在使用 HoughP 单独查找每个留置权段。您正在寻找一条(断线)线,因此使用常规 Hough 可能会更好,并且从结果 select 图像下半部分最强的水平线 - 然后擦除沿该方向的所有点。
ot:cv::namedWindow 可以有一个 trackbar,您可以在其中轻松取回值
根据@Link 的要求:
我在 python 方面的经验有限,所以我不知道这段代码的线程安全性如何,但这应该向您展示了在 python OpenCV 中创建轨迹栏的基础知识。
def onChange(pos):
global img
global gray
global dst
dst = np.copy(img)
apertureSize = cv2.getTrackbarPos("ApertureSize", "Result")
minLineLength = cv2.getTrackbarPos("LineLength", "Result")
maxLineGap = cv2.getTrackbarPos("LineGap", "Result")
# according to OpenCV, aperture size must be odd and between 3 and 7
if apertureSize % 2 == 0:
apertureSize += 1
if apertureSize < 3:
apertureSize = 3
edges = cv2.Canny(gray,100,200,apertureSize = apertureSize)
lines = cv2.HoughLinesP(edges,1,np.pi/180,15,minLineLength,maxLineGap)
for x in range(0, len(lines)):
for x1,y1,x2,y2 in lines[x]:
cv2.line(dst,(x1,y1),(x2,y2),(255,255,255),2)
#Run Main
if __name__ == "__main__" :
img = cv2.imread("image.png", -1)
dst = np.copy(img)
cv2.namedWindow("Result", cv2.WINDOW_NORMAL)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#default values for trackbars
defaultApertureSize = 5
minLineLength = 0
maxLineGap = 19
# according to OpenCV, aperture size must be odd and between 3 and 7
# the aperture size range is (0 - 6)
cv2.createTrackbar("ApertureSize", "Result", defaultApertureSize, 6, onChange)
# line length range is (0 - 10)
cv2.createTrackbar("LineLength", "Result", minLineLength, 10, onChange)
# line gap range is (0 - 19)
cv2.createTrackbar("LineGap", "Result", maxLineGap, 19, onChange)
while True:
cv2.imshow("Result", dst)
key = cv2.waitKey(1)
if key == ord('q'):
break
cv2.destroyAllWindows()