Как отфильтровать белые биты в монохромном изображении, которые превышают указанную область? - PullRequest
2 голосов
/ 01 декабря 2019

У меня есть это причудливое изображение «Изображение мозга, показывающее карту нейронных цепей коры головного мозга мыши»

enter image description here

, и я хочу сосчитатьКоличество зеленых вспышек побежало k-средних на 15 кластеров, и я выделил два цвета, которые вместе делают работу, но у меня осталось много зеленых полос / хвостов и краев желтых вспышек.

enter image description here

Я надеялся найти какой-то алгоритм, который порогов по области, и выбрать только реальные зеленые вспышки или, возможно, другой подход, где я не столкнулся бы с этой проблемой,Я использовал Python K-средства от sklearn.cluster

1 Ответ

1 голос
/ 03 декабря 2019

Вы можете использовать цветовой порог, чтобы изолировать зеленые вспышки. Идея состоит в том, чтобы преобразовать изображение в формат HSV и определить нижний / верхний диапазон цветового порога. Это даст вам бинарную маску. Отсюда мы можем выполнить дополнительную обработку, выполняя морфологическое раскрытие с помощью эллиптического ядра для удаления шума и хвостов. Наконец, мы можем найти контуры и отфильтровать их, используя область контура с определенной областью порога, чтобы сохранить только большие капли. Вот результат:

enter image description here

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()
...