3

我的图像大部分是黑色的,上面几乎没有白色斑点。我想将此类图像与没有此类斑点的图像区分开来。

我尝试了 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)

下面是一张测试图:

测试图像

未检测到顶部的白色区域。

4

1 回答 1

3

这里有两种更简单的方法,而不是使用 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()
于 2019-09-03T21:43:18.740 回答