python - 使用 OpenCV 检测小数点

标签 python image opencv image-processing computer-vision

使用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/

相关文章:

node.js - 下载图像并使用 multipart/form-data 将其发送到 API

opencv - OpenCV 中的颜色级别

android - 如何标准化 OpenCV Android 矩阵?

python - 同时处理多个版本?

python - 什么是 Python 鸡蛋缓存 (PYTHON_EGG_CACHE)?

ios - 图像无法加载到按钮上。 swift

Python 语法/列表切片问题 : What does this syntax mean?

image - 通过 mongo shell 脚本将图像文件读入 MongoDB 文档的二进制字段

python - 如何优雅地关闭任何 WSGI 服务器?

python - 基于 Unicode 值创建数值的简单 Python 程序,需要提示以简化我的代码