如何过滤单色图像中超出指定区域的白色位?

How to filter white bits in a monochrome image that exceed a specified area?

我有这张 "Brainbow image showing map of neuronal circuits of the mouse cerebral cortex"

的精美图片

我想计算绿色闪烁的数量,所以 运行 k-means 在它上面有 15 个簇,我将两种颜色分开来完成这项工作,但我剩下很多绿色黄色闪光的条纹/尾巴和边缘。

我希望找到一些按区域划分阈值的算法,select 只有实际的绿色闪烁,或者可能是另一种我不会遇到这个问题的方法。我使用了 python k-means 来自 sklearn.cluster

您可以使用颜色阈值来隔离绿色闪烁。想法是将图像转换为HSV格式并定义一个lower/upper颜色阈值范围。这会给你一个二进制掩码。从这里我们可以通过使用椭圆形内核执行形态学开运算来去除噪声和尾部来进行额外的处理。最后,我们可以找到轮廓并使用具有定义阈值区域的轮廓区域进行过滤,以仅保留较大的斑点。结果如下:

Count: 116

代码

import numpy as np
import cv2

# Color threshold
image = cv2.imread('1.jpg')
original = image.copy()
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower = np.array([42, 67, 0])
upper = np.array([69, 255, 255])
mask = cv2.inRange(hsv, lower, upper)

# Perform morphological operations
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel, iterations=1)

# Find contours and filter using contour area
cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
count = 0
for c in cnts:
    area = cv2.contourArea(c)
    if area < 5: 
        cv2.drawContours(opening,[c], -1, (0,0,0), -1)
    else:
        count += 1

result = cv2.bitwise_and(original,original,mask=opening)
print('Count: {}'.format(count))

cv2.imshow('mask', mask)
cv2.imshow('opening', opening)
cv2.imshow('result', result)
cv2.waitKey()