如何根据水平线拆分图像?

2024-05-14 23:44:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一种方法来分割图像的标题和蓝图部分,但现在我对如何做到这一点没有想法。(无法使用原始图像,因此我尝试重新创建) document

我试过用opencv的houghlines来做这个,但是由于蓝图的原因,它检测到很多不同的线条,所以我找不到一个清晰的点来切割图像。在

(像这样:) document with lines

我需要的是标题和蓝图的两个不同的图像,但现在我找不到一个好的方法来做这一切,所以任何帮助将是感激的。在


Tags: 方法图像标题原因opencv线条houghlines
2条回答

对于给定的输入图像:

input

如果我使用以下代码:

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)

我得到以下输出:

output

看,只有一条大直线区分标题和蓝图部分。如果只打印y1y2,就可以得到这条线的起始和结束y坐标。对于本例,它们是y1 : 140, y2 : 141。现在您需要的是,将图片裁剪为y像素141值,如下所示:

^{pr2}$

现在,来谈谈你的问题。这是一个可能的方法。通过houghline变换,可以看到区分页眉的最大直线和三条不同的红色直线检测出蓝图。对于这三条线,起始y坐标将非常接近,比如说142145143。您需要将直线(y2)的所有结束y坐标附加到一个列表中,并基于邻接对它们进行聚类,阈值为5-10像素,取最大的簇,从簇中获取最大的结束y坐标,并相应地裁剪原始图像。在

如果将标题与内容分开的那一行是图像宽度上最长的黑线,则可以通过将每行的像素相加,然后找出哪一行加起来最少,即黑色像素最多:

# get sums across rows
rowSums = np.sum(image,axis=1)

# get index of blackest row
longestBlack = np.argmin(rowSums)

相关问题 更多 >

    热门问题