使用OpenCV检测小数点

2024-09-29 07:19:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

enter image description here

42个图片集可以在这里找到:https://imgur.com/a/i4GPQwE-批量下载可用

我无法创建一个opencv检测器,它可以一致地找到这些类型图像中的大多数点,任何对单个图像有效的检测器(具有某些参数的斑点检测器)通常对其他图像无效。你知道吗

我的大多数尝试都是使用SimpleBlobDetector这是正确的方法吗? opencv不是任务的合适工具吗?(我需要一个现成的工具,训练神经网络目前是不可能的)

谢谢你的帮助。你知道吗


Tags: 工具https图像com类型参数批量字符
2条回答

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

  • 将图像转换为灰度,然后用大津阈值得到二值图像
  • 执行形态打开以消除小噪音
  • 找到轮廓并使用轮廓区域进行过滤

下面是一些图片的结果。小数点以绿色突出显示

enter image description hereenter image description here

enter image description hereenter image description here

enter image description hereenter 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()

注意:假设图像只包含数字而不包含其他伪影,此方法将很好地工作。替代方法包括:

  • Hough圆变换已经实现为^{}。缺点是函数有很多参数,通常只适用于“完美”循环。因为你的图像有小数点不是完美的圆,你可能得不到一致的结果,并可能得到误报。你知道吗
  • 轮廓近似使用cv2.arcLength()cv2.approxPolyDP(),后者使用Ramer-Douglas-Peucker算法,也称为分割合并算法。其思想是曲线可以由一系列短线段来近似。为了做到这一点,我们计算轮廓的周长,然后根据顶点的数量近似轮廓的形状。以this为例。你知道吗

您可以尝试使用Hough-Circles

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,
                            param1=50,param2=30,minRadius=5,maxRadius=25)

取自here。你知道吗

Documentation

相关问题 更多 >