我需要一种拆分图像的标题和蓝图部分的方法,但是现在我对如何执行此操作没有任何想法。 (不能使用原始图像,所以我尝试重新创建它)
我尝试使用opencv的背景线来执行此操作,但是由于蓝图,它检测到很多不同的线,所以我找不到清晰的位置来剪切图像。
我需要的是标题和蓝图的2张不同图像,但是现在我找不到一种很好的方法来做到这一点,因此将不胜感激。
答案 0 :(得分:1)
对于给定的输入图像:
如果我使用以下代码:
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
值:
img = cv2.imread(path/to/original/image)
img_header = img[:141,:]
img_blueprint = img[141:, :]
cv2.imwrite("header.png", img_header)
cv2.imwrite("blueprint.png", img_blueprint)
现在,解决您的问题。这是一种可能的方法。看到区分标题的最大直线,并且通过霍夫线变换,通过三个不同的红色直线检测到了蓝图。对于这三行,起始y坐标将非常接近,例如说142
,145
,143
。您需要将直线(y2)的所有结尾y坐标附加到列表中,并基于5-10像素阈值的邻接关系将它们全部聚类,以最大的聚类,以最大的结尾y坐标为准。从群集中获取纵坐标并相应地裁剪原始图像。
答案 1 :(得分:1)
如果将标题和内容分开的线是图像宽度上最长的黑色线,则可以通过将每一行的像素相加然后找到哪一行加起来最少(即黑色最多)来找到它像素:
# get sums across rows
rowSums = np.sum(image,axis=1)
# get index of blackest row
longestBlack = np.argmin(rowSums)