如何仅从图像中提取外部轮廓(OpenCV) - python

我正在尝试使用简单的OpenCV轮廓线方法从下面的图像中提取数字,但是轮廓上出现重叠的边框

如何仅从图像中提取外部轮廓(OpenCV) - python

cv2.RETR_EXTERNAL应该仅返回层次结构中的外部轮廓,但是从下面的输出可以看出,它不起作用

如何仅从图像中提取外部轮廓(OpenCV) - python

码:

from matplotlib import pyplot as plt
import cv2

img = cv2.imread('image.png', 0)

_, contours, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

imgRGB = cv2.cvtColor(img.copy(), cv2.COLOR_GRAY2RGB)

for c in contours:
    x,y,w,h = cv2.boundingRect(c)
    cv2.rectangle(imgRGB, (x, y), (x+w, y+h), (0,255,0), 2)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(imgRGB, cmap='gray')

要求:

opencv-python==3.4.5.20
matplotlib==3.1.2

参考方案

您需要先模糊处理然后应用阈值,然后再找到轮廓。您需要执行此操作,因为如果直接在灰度图像上找到轮廓,则会有细小颗粒被拾取为轮廓。这是一个简单的过程:

加载图像,灰度,高斯模糊,大津的阈值
查找轮廓并使用imutils.contours.sort_contours()left-to-right参数进行排序
获取边界框,然后使用Numpy切片提取ROI

这是检测到的以绿色突出显示的边界框

如何仅从图像中提取外部轮廓(OpenCV) - python

提取/保存的ROI

如何仅从图像中提取外部轮廓(OpenCV) - python

import cv2
from imutils import contours

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(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
(cnts, _) = contours.sort_contours(cnts, method="left-to-right")
num = 0
for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 1)
    ROI = original[y:y+h, x:x+w]
    cv2.imwrite('ROI_{}.png'.format(num), ROI)
    num += 1

cv2.imshow('image', image)
cv2.waitKey()

用圆和线计算变换 - python

我试图确定两个图像之间的转换(旋转+平移+缩放),以使其移动。图像是用两种不同的方式拍摄的,这些方式会产生非常不同的纹理。所以我不能使用基于维持光流的技术。我认为最好将图像阈值化以提取几何形状(请参见下面的示例)。但是然后我很难看到我能做些什么...也许可以提取垂直线和中心圆来帮助我提取变换。我在python中工作,我研究了Opencv可以提供的功能,但目前…

解析netParameter文件失败 - python

>py yolo.py --video-path='F:/Data_Science/Python37/Scripts/YOLO/videos/lowres.mp4' Traceback (most recent call last): File "yolo.py", line 88, in <module&…

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

python-docx应该在空单元格已满时返回空单元格 - python

我试图遍历文档中的所有表并从中提取文本。作为中间步骤,我只是尝试将文本打印到控制台。我在类似的帖子中已经看过scanny提供的其他代码,但是由于某种原因,它并没有提供我正在解析的文档的预期输出可以在https://www.ontario.ca/laws/regulation/140300中找到该文档from docx import Document from…