我的图像大部分是黑色的,上面有很少的白色斑点。我想将这些图像与那些没有这样的斑点的图像区分开来。
我尝试了MSER,并调整了它的参数,以便在大多数有斑点的图像中正确检测斑点,在没有斑点的图像中返回0结果。
下面是我的MSER参数配置。
mser = cv2.MSER_create(_delta = 3,_min_diversity=0.2,_edge_blur_size = 5 ,_max_variation = 0.10,_min_area = 120,_max_area = 1000)下面是一张测试图片:

未检测到顶部的白色区域。
发布于 2019-09-04 05:43:19
与使用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()https://stackoverflow.com/questions/57767518
复制相似问题