作者:gu油漆装修 | 来源:互联网 | 2023-12-10 10:48
本文介绍了使用Python从工程图图像中提取底部的方法。首先将输入图片转换为灰度图像,并进行高斯模糊和阈值处理。然后通过填充潜在的轮廓以及使用轮廓逼近和矩形核进行过滤,去除非矩形轮廓。最后通过查找轮廓并使用轮廓近似、宽高比和轮廓区域进行过滤,隔离所需的底部轮廓,并使用Numpy切片提取底部模板部分。
我的输入图片
提取突出显示的部分
我想要的输出
请有人帮助并给我一个建议。我的图像看起来像这样。这只是示例之一。我需要裁剪底部模板部分并执行OCR。我已附上我的愿望输出图片。请看一看。如何使用python来实现它?
PS:纸张尺寸会有所不同,并且模板可能会移位。但大部分会在左下角
这是一种潜在的方法:
-
获取二进制图像。我们先转换为灰度,高斯模糊,然后转换为大津的阈值
-
填充潜在的轮廓。我们遍历轮廓并使用轮廓逼近进行过滤以确定它们是否为矩形。
-
执行形态学操作。我们使用矩形核对顶点进行变形以去除非矩形轮廓。
-
过滤并提取所需轮廓。查找轮廓并使用轮廓近似,宽高比和轮廓区域进行过滤以隔离所需轮廓。然后使用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,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),-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,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,(36,12),-1)
ROI = original[y:y+h,x:x+w]
cv2.imwrite('image.png',image)
cv2.imwrite('ROI.png',ROI)
cv2.waitKey()