如何使用python从工程图图像中提取底部?
Posted
技术标签:
【中文标题】如何使用python从工程图图像中提取底部?【英文标题】:How to extract bottom part from engineering drawing image using python? 【发布时间】:2020-03-31 10:21:41 【问题描述】:我的输入图像
提取高亮部分
我想要的输出
请有人帮助并给我一个建议。我的图像看起来像这样。这只是示例之一。我需要裁剪底部模板部分并进行 OCR。我附上了我的愿望输出图片。请看一看。如何用python实现?
PS:纸张尺寸会有所不同,模板可能会错位。但主要是在左下角
【问题讨论】:
这是否回答了您的问题(至少对于裁剪而言)? How to crop an image in OpenCV using Python 我需要以编程方式识别模板部分并裁剪它 【参考方案1】:这是一种可能的方法:
获取二值图像。我们转换为灰度,高斯模糊,然后是 Otsu 的阈值
填充潜在轮廓。我们遍历轮廓并使用轮廓近似进行过滤以确定它们是否为矩形。
执行形态学运算。我们使用矩形核进行变形以去除非矩形轮廓。
过滤并提取所需轮廓。 使用轮廓近似、纵横比和轮廓区域查找轮廓并过滤以隔离所需轮廓。然后使用 Numpy 切片进行提取。
-
二进制图像
-
轮廓填充
-
去除非矩形轮廓的形态学操作
-
所需轮廓以绿色突出显示
提取的投资回报率
代码
import cv2
# Grayscale, blur, and threshold
image = cv2.imread('1.png')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3,3), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# Fill in potential contours
cnts = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.05 * peri, True)
if len(approx) == 4:
cv2.drawContours(thresh, [c], -1, (255,255,255), -1)
# Remove non rectangular contours
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (40,10))
close = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
# Filtered for desired contour
cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.05 * peri, True)
x,y,w,h = cv2.boundingRect(approx)
aspect_ratio = w / float(h)
area = cv2.contourArea(approx)
if len(approx) == 4 and w > h and aspect_ratio > 2.75 and area > 45000:
cv2.drawContours(image, [c], -1, (36,255,12), -1)
ROI = original[y:y+h, x:x+w]
cv2.imwrite('image.png', image)
cv2.imwrite('ROI.png', ROI)
cv2.waitKey()
【讨论】:
优秀的答案/方法!以上是关于如何使用python从工程图图像中提取底部?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 python 从 flickr xml 图像数据中提取图像地理数据?