这里有两种更简单的方法,而不是使用 MSER
方法#1
将图像转换为灰度和 Otsu 的阈值以获得二值图像。然后找到轮廓并使用最小阈值区域进行过滤。根据您要检测多少白色斑点,您可以调整此阈值区域。这是检测到的白色区域以绿色突出显示的结果
import cv2
image = cv2.imread('1.png')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
if area > 50:
cv2.drawContours(original, [c], -1, (36, 255, 12), -1)
cv2.imshow('thresh', thresh)
cv2.imshow('original', original)
cv2.imwrite('original.png', original)
cv2.waitKey()
方法#2
由于 OpenCV 图像存储为 Numpy 数组,我们可以简单地使用切片来创建大于某个阈值的像素掩码。这是结果
import cv2
image = cv2.imread('1.png')
mask = (image >= [150.,150.,150.]).all(axis=2)
image[mask] = [36, 255, 12]
cv2.imshow('image', image)
cv2.waitKey()