首页 > 解决方案 > 使用openCV从图像中提取图形数据

问题描述

我对 python 和 openCV 都很陌生。我只需要一个项目。用户用手机拍摄心电图并将其发送到我需要提取图形数据的服务器,仅此而已。

这是一个示例图像:

原始图像样本

我应该首先裁剪图像以仅显示我认为的图形。因为我找不到手动完成的方法。

在此处输入图像描述

这是一些代码,它试图通过使线条变白来隔离图形(它适用于裁剪的图像)仍然会在最后留下一些讨厌的噪音和不准确的多边形,有些部分没有被检测到:

import cv2
import numpy as np

img = cv2.imread('image.jpg')

kernel = np.ones((6,6),np.uint8)
dilation = cv2.dilate(img,kernel,iterations = 1)

gray = cv2.cvtColor(dilation, cv2.COLOR_BGR2GRAY)
#
ret,gray = cv2.threshold(gray,160,255,0)
gray2 = gray.copy()
mask = np.zeros(gray.shape,np.uint8)

contours, hier = cv2.findContours(gray,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
    if cv2.contourArea(cnt) > 400:
        approx = cv2.approxPolyDP(cnt,
                                  0.005 * cv2.arcLength(cnt, True), True)
        if(len(approx) >= 5):
            cv2.drawContours(img, [approx], 0, (0, 0, 255), 5)
res = cv2.bitwise_and(gray2,gray2,mask)
cv2.imwrite('output.png',img)

在此处输入图像描述

现在我需要让它变得更好。我从不同的地方找到了大部分代码并将它们附加在一起。

np.ones((6,6),np.uint8)

例如,如果我使用 6,6 以外的任何东西,我就有麻烦了:皱眉:也

cv2.threshold(gray,160,255,0)

我通过调整代码中的所有其他硬编码值找到了 160 255,如果另一张图片上的照明不同并且这些值不再起作用怎么办?

除此之外,我仍然没有得到我想要的结果,我想要一些多边形由底部和顶部的两条不同的线连接!

我只想要一行从开始到结束。

请指导我调整和修复它以供更一般的使用。

标签: pythonopencvimage-processing

解决方案


推荐阅读