Обнаружение клетки малярии в сканированном изображении - PullRequest
1 голос
/ 17 февраля 2020

Я использую изображение сканирования малярии, чтобы классифицировать изображение малярии или нет. Набор данных загружается из kaggle.

Я достигаю 96% точности.

Теперь мне интересно, как обнаружить ячейку в сканированном изображении. Мне нужно указать на ячейку малярии на изображении или нарисовать контур для ячейки малярии.

Образец изображения, который содержит ячейку малярии

enter image description here

Как мне добиться обнаружения в этой проблеме?

1 Ответ

4 голосов
/ 17 февраля 2020

Если я предполагаю, что вы хотите найти темно-фиолетовый цвет на изображении, то это один из способов сделать это с помощью Python / OpenCV / Numpy / Sklearn.

  • Считать входное изображение без альфа канал для удаления текстовых направляющих
  • Делать цветовую сегментацию kmeans, используя 3 цвета (для возврата: черный, светло-фиолетовый, темно-фиолетовый). Я использую Sklearn, так как это немного проще для меня. Но вы можете сделать это и с OpenCV.
  • Делать пороговые значения цветного изображения на темно-фиолетовом цвете
  • (При желании добавить морфологию, хотя я не использовал ее здесь)
  • Получить все контуры, а также самый большой контур (отдельно)
  • Сохранить полученные изображения


Ввод:

enter image description here

import cv2
import numpy as np
from sklearn import cluster

# read image
image = cv2.imread("purple_cell.png")
h, w, c = image.shape

# convert image to float in range 0-1 for sklearn kmeans
img = image.astype(np.float64)/255.0

# reshape image to 1D
image_1d = img.reshape(h*w, c)

# compute kmeans for 3 colors
kmeans_cluster = cluster.KMeans(n_clusters=3)
kmeans_cluster.fit(image_1d)
cluster_centers = kmeans_cluster.cluster_centers_
cluster_labels = kmeans_cluster.labels_

# need to scale back to range 0-255
newimage = (255*cluster_centers[cluster_labels].reshape(h, w, c)).clip(0,255).astype(np.uint8)

# Set BGR color ranges
lowerBound = np.array([170,90,120]);
upperBound = np.array([195,110,140]);

# Compute mask (roi) from ranges in dst
thresh = cv2.inRange(newimage, lowerBound, upperBound);

# get largest contour and all contours
contours = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
area_thresh = 0
result1 = image.copy()
for c in contours:
    cv2.drawContours(result1, [c], -1, (0, 255, 0), 1)
    area = cv2.contourArea(c)
    if area > area_thresh:
        area_thresh=area
        big_contour = c

# draw largest contour only
result2 = image.copy()
cv2.drawContours(result2, [big_contour], -1, (0, 255, 0), 1)


cv2.imshow('image', image)
cv2.imshow('newimage', newimage)
cv2.imshow('thresh', thresh)
cv2.imshow('result1', result1)
cv2.imshow('result2', result2)
cv2.waitKey()

cv2.imwrite('purple_cell_kmeans_3.png', newimage)
cv2.imwrite('purple_cell_thresh.png', thresh)
cv2.imwrite('purple_cell_extracted1.png', result1)
cv2.imwrite('purple_cell_extracted2.png', result2)


Kmeans Изображение:

enter image description here

Изображение с порогом:

enter image description here

Изображение всех контуров:

enter image description here

Самое большое изображение контура:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...