Как найти на изображении раковые клетки

Python отлично подходит для обработки изображений. Сегодня мы расскажем о том, как найти на снимке раковые клетки. На примере реального датасета покажем, как провести фильтрацию (сглаживание) изображения и как найти на нем локальные максимумы с помощью Python-библиотеки skimage.

Датасет изображений

Возьмем датасет (MCF7 Cell Painting) с изображениями клеток, снятых с помощью флуоресцентной микроскопии. Если быть точнее, то изображения представляют собой клетки рака молочной железы MCF-7, обработанные в течение 24 часов набором из 113 небольших молекул в восьми концентрациях.

Скачаем только один архив и распакуем в директорию images/. Если у вас Windows, то качайте напрямую по ссылке, если у вас Unix-подобная ОС, то можете использовать следующие команды (wget можно заменить на curl):

wget https://data.broadinstitute.org/bbbc/BBBC021/BBBC021_v1_images_Week1_22123.zip
mkdir images
unzip BBBC021_v1_images_Week1_22123.zip -d ./images 

Найдем все изображения DAPI

DAPI — это флуоресцентный краситель, который связывается с ДНК и окрашивает ядра на каждом изображении. Обычно сигнал DAPI улавливается в первом канале микроскопа. Поэтому мы будем работать с изображениям с первым каналом. Такие изображения содержать w1 в названии.

Для нахождения файлов по названию используем Python-функцию glob:

from glob import glob

paths = glob('images/Week1_22123/Week1_*_w1*.tif')
paths.sort()

А теперь посмотрим, что за изображения у нас имеются. Пример кода на Python для отображения изображений:

from skimage import io
import matplotlib.pyplot as plt

img = io.imread(paths[0])
print(img.shape, img.dtype, img.min(), img.max())
# => (1024, 1280) uint16 176 10016

plt.figure(figsize=(6, 6))
plt.imshow(img, cmap='gray', vmax=4000)
plt.axis('off')
Отображение изображений в Python
Снимок раковых клеток

Как найти раковые клетки на изображении с библиотекой skimage

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

Для работы с изображениями воспользуемся Python-библиотекой skimage [1]. Сначала сгладим изображение с помощью гауссовского фильтра gaussian со значением sigma. Аргумент preserve_range=True не дает провести нормализацию, поэтому сглаженное изображение будет находится в том же диапазон интенсивности, что и входные. Затем найдем локальные максимумы в сглаженном изображении с помощью функции peak_local_max. Установим min_distance=4, чтобы предотвратить нереалистичное сближение любых двух центров, и threshold_abs=1000, чтобы избежать ложных срабатываний в темных областях изображения.

Код на Python для сглаживания и нахождения локальных максимумов выглядит следующим образом:

from skimage.filters import gaussian
from skimage.feature import peak_local_max

def detect_nuclei(img, sigma=4, min_distance=6, threshold_abs=1000):
    g = gaussian(img, sigma, preserve_range=True)
    return peak_local_max(g, min_distance, threshold_abs)

Поссмотрим, как функция определит клетки на изображении выше:

centers = detect_nuclei(img)

plt.figure(figsize=(6, 6))
plt.imshow(img, cmap='gray', vmax=4000)
plt.plot(centers[:, 1], centers[:, 0], 'r.')
plt.axis('off')
Найденные в Python центры клетки
Снимок, с найденными центрами клеток

 

В следующей статье эту функцию применим к остальным изображениям с использованием 5 различных методов, включая многопроцессорную обработку, сравним скорость работы и выберем лучший. А о том, как обрабатывать изображения на реальных задачах Data Science вы узнаете на специализированном курсе по компьютерному зрению «VISI: Computer vision на Python» в лицензированном учебном центре обучения и повышения квалификации разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве.

Источники
  1. skimage

Добавить комментарий

Поиск по сайту