如何从图像中检测小数点,这是一个比较简单典型的问题。比如说像下面这样的一张图,检测出小数点的位置。
这里的思路简单来说可以按照下面的三个步骤:
1. 如果是RGB彩色图,可以转变为灰度图,然后使用阈值方法将其二值化(可以采用OTSU等自适应的阈值方法)
2. 采用简单降噪的方法把一些小的噪声点去除(这里方法很多样,一般可以采用高斯低通或者形态学方法)
3. 找到闭合轮廓线,使用轮廓线围成的面积进行筛选
下面是使用python写的算法逻辑,可以直接运行。
import cv2
import numpy as np
img = cv2.imread(path) #读入图像
original = img.copy()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] # OTSU 将图像二值化
# 形态学方法滤掉小噪点
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()