Сегментация изображений для поиска клеток в биологических изображениях - PullRequest
2 голосов
/ 05 мая 2019

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

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

Вот код, который я сейчас использую, который принимает оттенки серого.image в виде пустого массива и ищет ячейку в виде круга:

import cv2
import numpy as np
smallest_dim = min(img.shape)
min_rad = int(img.shape[0]*0.05)
max_rad = int(img.shape[0]*0.5) #0.5
circles = cv2.HoughCircles((img*255).astype(np.uint8),cv2.HOUGH_GRADIENT,1,50,
    param1=50,param2=30,minRadius=min_rad,maxRadius=max_rad)
circles = np.uint16(np.around(circles))
x, y, r = circles[0,:][:1][0]

Вот пример, в котором код нашел неправильную окружность в качестве границы ячейки.Похоже, его смутил ганк, окружающий камеру: Failed Hough Transform

1 Ответ

2 голосов
/ 06 мая 2019

Я думаю, что одной из проблем может быть построение круга (координаты могут быть неправильными).

Кроме того, как упоминалось в @Nicos, есть много настроек, связанных с традиционной обработкой изображений, чтобы заставить конкретные случаи работать (в то время как более поздние подходы к машинному обучению - это то, что модели не перетренируются), моя попытка с лыжным магом отображается ниже. Диапазон радиуса, количество кругов, изображение для обнаружения краев - все это нужно настроить ... учитывая потенциальные различия между изображениями и внутри них. В этом изображении, по крайней мере для меня, есть 3 круга с переменным градиентом, из изображения canny обнаружения краев, вы можете видеть, что мы получаем более 3 кругов, кроме того, "освещенность", кажется, меняется на в разных местах (из-за того, что это sem-изображение)?!

import matplotlib.pyplot as plt
import numpy as np
import imageio

from skimage import data, color
from skimage.transform import hough_circle, hough_circle_peaks
from skimage.feature import canny
from skimage.draw import circle_perimeter
from skimage.util import img_as_ubyte
!wget https://i.stack.imgur.com/2tsWw.jpg
# rgb to gray https://stackoverflow.com/a/51571053/868736
im = imageio.imread('2tsWw.jpg')
gray = lambda rgb : np.dot(rgb[... , :3] , [0.299 , 0.587, 0.114]) 
gray = gray(im)  
image = np.array(gray[60:220,210:450])
plt.imshow(image,cmap='gray')

enter image description here

edges = canny(image, sigma=3,)
plt.imshow(edges,cmap='gray')

enter image description here

overlayimage = np.copy(image)

# https://scikit-image.org/docs/dev/auto_examples/edges/plot_circular_elliptical_hough_transform.html

hough_radii = np.arange(30, 60, 2)
hough_res = hough_circle(edges, hough_radii)

# Select the most prominent X circles
x=1
accums, cx, cy, radii = hough_circle_peaks(hough_res, hough_radii,
                                           total_num_peaks=x)
# Draw them
fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(10, 4))
#image = color.gray2rgb(image)
for center_y, center_x, radius in zip(cy, cx, radii):
    circy, circx = circle_perimeter(center_y, center_x, radius)
    overlayimage[circy, circx] = 255

print(radii)
ax.imshow(overlayimage,cmap='gray')
plt.show()

enter image description here

...