gpt4 book ai didi

python-3.x - 获取垂直线 numpy 的线坐标

转载 作者:太空宇宙 更新时间:2023-11-03 21:40:53 28 4
gpt4 key购买 nike

我在这张图片中检测到了水平线和垂直线:

enter image description here

enter image description here

enter image description here

使用此代码:

import numpy as np
import cv2 as cv

src = cv.imread("filename.png", cv.IMREAD_COLOR)

if len(src.shape) != 2:
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
else:
gray = src

gray = cv.bitwise_not(gray)
bw = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 15, -2)

horizontal = np.copy(bw)
vertical = np.copy(bw)

cols = horizontal.shape[1]
horizontal_size = int(cols / 30)

horizontalStructure = cv.getStructuringElement(cv.MORPH_RECT, (horizontal_size, 1))
horizontal = cv.erode(horizontal, horizontalStructure)
horizontal = cv.dilate(horizontal, horizontalStructure)

#np.set_printoptions(threshold=np.inf)
cv.imwrite("img_horizontal8.png", horizontal)

h_transpose = np.transpose(np.nonzero(horizontal))
print("h_transpose")
print(h_transpose[:100])
#prints [ 56 35] ... [ 56 134]
#and that makes sense, there is an horizontal line more or less in the height 56 like that on the image img_horizontal8.png



rows = vertical.shape[0]
verticalsize = int(rows / 30)
verticalStructure = cv.getStructuringElement(cv.MORPH_RECT, (1, verticalsize))
vertical = cv.erode(vertical, verticalStructure)
vertical = cv.dilate(vertical, verticalStructure)

cv.imwrite("img_vertical8.png", vertical)

v_transpose = np.transpose(np.nonzero(vertical))

print("v_transpose")
print(v_transpose[:100])

prints:

[ 68 489]
[ 68 490]
[ 69 489]
[ 69 490]
[ 69 721]
[ 70 489]
[ 70 490]
[ 70 721]
[ 71 489]
[ 71 490]
[ 71 721]
[ 71 950]
[ 72 489]
[ 72 490]
[ 72 721]
[ 72 950]
[ 73 489]
[ 73 490]
[ 73 721]
[ 73 950]
[ 74 489]
[ 74 490]
[ 74 721]
[ 74 950]
[ 75 489]
[ 75 490]
[ 75 721]
[ 75 950]
[ 75 1179]
[ 75 1410]
[ 76 489]
[ 76 490]
[ 76 721]
[ 76 950]
[ 76 1178]
[ 76 1179]
[ 76 1410]
[ 77 489]
[ 77 490]
[ 77 721]
[ 77 950]
[ 77 1178]
[ 77 1179]
[ 77 1410]
[ 78 489]
[ 78 490]
[ 78 721]
[ 78 950]
[ 78 1178]
[ 78 1179]
[ 78 1410]

我对获取垂直线的坐标有什么误解吗?打印结果似乎显示我们有一条从 68,489 到 68,490 的线(长度为 1 的线),然后是一堆其他非常短的线,直到 x=78 的点。但是在图像 img_vertical8.png 上看不到极短的线条,所以我不明白发生了什么。这些垂直线的阵列是否由于某种原因可能是错误的?有什么想法吗?

最佳答案

问题

您正在打印的是您生成的主要为黑色和白色条纹的图像的像素坐标。它们没有任何关联信息,因此您不应假设在您生成的列表中相邻的两个像素实际上在它们之间有一条线。

我认为您感到困惑的是 np.nonzero 正在有效地对您正在打印的数据进行排序。通过“排序”,我的意思是它的返回值将始终首先包含第 0 行中的非零值的索引,然后是 1st 行中的非零值的索引,等等。

把它想象成一个旧的 CRT 显示器(如果你足够大,知道那是什么):nonzero 在你的图像上水平扫描,连续捕捉平行线上的像素彼此之间,没有连接。

解决方案

您可以进一步处理垂直线和水平线的图像,以获得您想要的实际线条。按照说明,我找到了 here , 我通过找到线段然后将线段绘制回原始报纸图像上制作了以下图像:

enter image description here

这是我使用的代码(它建立在你的代码停止的地方):

img = src.copy()

# edges = cv.Canny(vertical,50,150,apertureSize = 3)
minLineLength = 100
maxLineGap = 200
lines = cv.HoughLinesP(vertical,1,np.pi/180,100,minLineLength,maxLineGap)
for line in lines:
for x1,y1,x2,y2 in line:
cv.line(img,(x1,y1),(x2,y2),(0,255,0),2)

cv.imwrite('houghlinesP_vert.jpg', img)

关于python-3.x - 获取垂直线 numpy 的线坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53831171/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com