如何使用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从图像中提取文本或数字

如何从视频中提取某一帧的图像

如何使用 python 从 flickr xml 图像数据中提取图像地理数据?

python - 如何在python中使用MTCNN从文件夹中的图像中提取人脸?

如何从视频中提取某一帧的图像

如何设置 MKPinAnnotation 使图像底部指向位置而不是图像中心