python - 使用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,如果另一张图片上的照明不同并且这些值不再起作用怎么办?
除此之外,我仍然没有得到我想要的结果,我想要一些多边形由底部和顶部的两条不同的线连接!
我只想要一行从开始到结束。
请指导我调整和修复它以供更一般的使用。
解决方案
推荐阅读
- reactjs - 子容器边界内的 AppBar / Dialog
- ionic-framework - 让 MatSlider 使用 ionic 5(垂直滑块)
- glsl - GPU 挂在自旋锁机制上(GLSL + Vulkan)
- reactjs - 无法访问 app.js react-native 中的上下文
- java - 使用 GoogleMaps 在 RecyclerView 中绘制路线
- algorithm - 与输入数量及其大小有关的时间复杂度
- php - .htaccess 子目录中语言检测的规则
- laravel - Laravel:上传文件夹在错误的目录中创建
- postgresql - 如何在 redis 和 PostgreSQL 表行之间同步值?
- shell - Bash 有条件地重定向标准。输出基于详细程度