<p>对于给定的输入图像:</p>
<p><a href="https://i.stack.imgur.com/H1uYj.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/H1uYj.png" alt="input"/></a></p>
<p>如果我使用以下代码:</p>
<pre><code>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)
</code></pre>
<p>我得到以下输出:</p>
<p><a href="https://i.stack.imgur.com/oggea.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/oggea.jpg" alt="output"/></a></p>
<p>看,只有一条大直线区分标题和蓝图部分。如果只打印<code>y1</code>和<code>y2</code>,就可以得到这条线的起始和结束y坐标。对于本例,它们是<code>y1 : 140, y2 : 141</code>。现在您需要的是,将图片裁剪为y像素<code>141</code>值,如下所示:</p>
^{pr2}$
<p>现在,来谈谈你的问题。这是一个可能的方法。通过houghline变换,可以看到区分页眉的最大直线和三条不同的红色直线检测出蓝图。对于这三条线,起始y坐标将非常接近,比如说<code>142</code>,<code>145</code>,<code>143</code>。您需要将直线(y2)的所有结束y坐标附加到一个列表中,并基于邻接对它们进行聚类,阈值为5-10像素,取最大的簇,从簇中获取最大的结束y坐标,并相应地裁剪原始图像。在</p>