2024-05-14 23:44:19 发布
网友
我需要一种方法来分割图像的标题和蓝图部分,但现在我对如何做到这一点没有想法。(无法使用原始图像,因此我尝试重新创建)
我试过用opencv的houghlines来做这个,但是由于蓝图的原因,它检测到很多不同的线条,所以我找不到一个清晰的点来切割图像。在
(像这样:)
我需要的是标题和蓝图的两个不同的图像,但现在我找不到一个好的方法来做这一切,所以任何帮助将是感激的。在
对于给定的输入图像:
如果我使用以下代码:
import cv2 import numpy as np img = cv2.imread('test1.png') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray,50,150,apertureSize = 3) lines = cv2.HoughLines(edges,1,np.pi/180,200) for rho,theta in lines[0]: a = np.cos(theta) b = np.sin(theta) x0 = a*rho y0 = b*rho x1 = int(x0 + 1000*(-b)) y1 = int(y0 + 1000*(a)) x2 = int(x0 - 1000*(-b)) y2 = int(y0 - 1000*(a)) cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2) cv2.imwrite('houghlines3.jpg',img)
我得到以下输出:
看,只有一条大直线区分标题和蓝图部分。如果只打印y1和y2,就可以得到这条线的起始和结束y坐标。对于本例,它们是y1 : 140, y2 : 141。现在您需要的是,将图片裁剪为y像素141值,如下所示:
y1
y2
y1 : 140, y2 : 141
141
现在,来谈谈你的问题。这是一个可能的方法。通过houghline变换,可以看到区分页眉的最大直线和三条不同的红色直线检测出蓝图。对于这三条线,起始y坐标将非常接近,比如说142,145,143。您需要将直线(y2)的所有结束y坐标附加到一个列表中,并基于邻接对它们进行聚类,阈值为5-10像素,取最大的簇,从簇中获取最大的结束y坐标,并相应地裁剪原始图像。在
142
145
143
如果将标题与内容分开的那一行是图像宽度上最长的黑线,则可以通过将每行的像素相加,然后找出哪一行加起来最少,即黑色像素最多:
# get sums across rows rowSums = np.sum(image,axis=1) # get index of blackest row longestBlack = np.argmin(rowSums)
对于给定的输入图像:
如果我使用以下代码:
我得到以下输出:
看,只有一条大直线区分标题和蓝图部分。如果只打印
^{pr2}$y1
和y2
,就可以得到这条线的起始和结束y坐标。对于本例,它们是y1 : 140, y2 : 141
。现在您需要的是,将图片裁剪为y像素141
值,如下所示:现在,来谈谈你的问题。这是一个可能的方法。通过houghline变换,可以看到区分页眉的最大直线和三条不同的红色直线检测出蓝图。对于这三条线,起始y坐标将非常接近,比如说
142
,145
,143
。您需要将直线(y2)的所有结束y坐标附加到一个列表中,并基于邻接对它们进行聚类,阈值为5-10像素,取最大的簇,从簇中获取最大的结束y坐标,并相应地裁剪原始图像。在如果将标题与内容分开的那一行是图像宽度上最长的黑线,则可以通过将每行的像素相加,然后找出哪一行加起来最少,即黑色像素最多:
相关问题 更多 >
编程相关推荐