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')

Как найти раковые клетки на изображении с библиотекой 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')

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



