gpt4 book ai didi

python - 使用 OpenCV 检测小数点

转载 作者:行者123 更新时间:2023-12-02 08:05:04 25 4
gpt4 key购买 nike

使用opencv-python,我试图在与此类似的图像中找到dot字符的位置:

enter image description here

此处设置的 42 个图像可以在此处找到:/image/4ezTX.jpg - 可以批量下载

我无法创建一个能够一致地找到这些类型图像中的大多数点的 opencv 检测器,无论在单个图像上如何工作(具有某些参数的 Blob 检测器),通常在其他图像上都会失败。

我的大部分尝试都是围绕使用 SimpleBlobDetector 这是正确的方法吗?opencv 不是完成该任务的正确工具吗? (我需要一个现成的工具,目前无法训练神经网络)

感谢您的帮助。

最佳答案

这里有一个使用阈值+轮廓过滤的简单方法,而不是使用SimpleBlobDetector:

  • 将图像转为灰度图,然后使用Otsu阈值得到二值图像
  • 进行形态学开运算以去除小噪声
  • 查找轮廓并使用轮廓区域进行过滤
<小时/>

这是您的一些图像的结果。小数点以绿色突出显示

enter image description here enter image description here

enter image description here enter image description here

enter image description here enter image description here

代码

import cv2
import numpy as np

image = cv2.imread('3.jpg')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)

cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
print(area)
if area < 200:
cv2.drawContours(original, [c], -1, (36,255,12), -1)

cv2.imshow('thresh', thresh)
cv2.imshow('opening', opening)
cv2.imshow('original', original)
cv2.waitKey()
<小时/>

注意:如果图像仅包含数字且不包含其他伪影,则此方法可以很好地工作。替代方法包括:

  • 霍夫圆变换已实现为 cv2.HoughCircles() 。缺点是该函数有大量参数,并且通常仅适用于“完美”圆。由于您的图像具有非完美圆形的小数点,因此您可能无法获得一致的结果,并且可能会出现误报。
  • 使用 cv2.arcLength()cv2.approxPolyDP() 进行轮廓近似,其中使用 Ramer-Douglas-Peucker算法,也称为分割合并算法。这个想法是曲线可以通过一系列短线段来近似。为此,我们计算轮廓的周长,然后根据顶点数量近似轮廓的形状。看看this举个例子。

关于python - 使用 OpenCV 检测小数点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59079447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com