Специализированная программа ImgCyto, выполняющая оптико-структурный анализ микроизображений клеточных ядер, разработана с использованием библиотеки компьютерного зрения OpenCV. Обосновывается использование библиотеки OpenCV для данного класса задач, и описываются ее функции и возможности.
Проблема автоматизации морфологического анализа цитологических проб решается путем количественного описания характеристик клеток и ядер, которые в настоящее время могут быть выполнены путем математической обработки цифрового изображения препарата [1]. Разработка специализированной программы ImgCyto, выполняющей оптико-структурный анализ микроизображений клеточных ядер и организовывающей базу данных собранных характеристик, является актуальной задачей. Программа предназначена для использования в клинических и биологических лабораториях в процессе проведения цитофотометрических анализов.
В данной работе обосновывается выбор языка программирования и инструментария. В статье дается характеристика библиотеки OpenCV, обсуждаются ее возможности, кратко описываются типы данных и набор основных функций.
Диалоговое окно программы ImgCyto показано на рис. 1. Программа обрабатывает серию монохромных изображений или цветных RGB изображений с глубиной 16 бит. Допустимо также и 8 битное изображение. Изображение содержит одну или несколько клеток или клеточных ядер.
Диалоговое окно программы ImgCyto
Исходное микроизображение тестового препарата приведено на рис. 2 а, увеличенное изображение одного клеточного ядра – на рис. 2 б. При изготовлении тестовых препаратов использовались неделящиеся ядра клеток крови нескольких биологических видов. Препараты окрашивались специфичным в отношении ДНК реактивом Шиффа после гидролиза соляной кислотой, по методу Р.Фельгена. Это – один из основных методов подготовки препаратов для определения количества ДНК в клетке с помощью цитофотометрии [1].
Изображение тестового препарата крови: а – вид поля изображения, б – увеличенное изображение одного ядра с выделенным контуром
Требуется выделить контуры этих объектов, и для каждого объекта вычислить его характеристики (площадь, периметр, коэффициент сжатия, оптическая плотность и пр.) Программа должна работать под операционной системой Windows.
При работе с изображением возникают потребности в различных представлениях изображения. Промежуточное представление изображения хранится в формате float32, что обеспечивает меньше потерь в изображении при различных операциях. Исходное цветное изображение для дальнейшей обработки переводится в монохромное. В программе по выбору допустим один из шести различных вариантов такого перевода.
Исходное изображение препарата нормируется по фоновому изображению. На ряде препаратов контуры выделяются лучше, если изображение предварительно сгладить. Задействован так же ряд алгоритмов работы с контурами. Перед выделением контуров, следует выполнить сегментацию, и привести изображение в бинарное представление. Для найденных контуров строится выпуклая оболочка. Вычисляется периметр и площадь контура. Внутри контура выделяется компактный и диффузный хроматины методом пороговой сегментации. Допустима пользовательская установка этого порога. Вычисляются оптические плотности как по всему контуру, так отдельно по компактному и диффузному хроматину.
Библиотека OpenCV [2, 3, 4] содержит несколько сотен функций работы с изображениями, и подходит для использования в данной задаче. Это библиотека алгоритмов обработки изображений и численных алгоритмов общего назначения. При использовании библиотеки уменьшаются трудозатраты на написание и отладку программы.
Для обработки мультимедийных данных существует также Intel IPP (Integrated Performance Primitives) библиотека, которая по ряду характеристик превосходит библиотеку OpenCV. Но для использования этой библиотеки следует покупать не только саму библиотеку, но и Intel Parallel Studio. В противовес Intel IPP, библиотека OpenCV является программным продуктом с открытым кодом.
Выбор же между языком C/C++ и языком Java был сделан после их апробирования, анализа и написания пробных программ. В итоге, в качестве языка программирования был выбран язык Java. Выбор в пользу Java против C/C++ не так очевиден, но пробные программы, и в частности работа с диалоговыми окнами, показали некоторое удобство в пользу Java. К тому же, для использования OpenCV на Java, существует обертка (wrapper) JavaCV. И среда разработки Netbeans (наиболее популярная среда разработки для языка Java) хорошо подошла для использования JavaCV. Дополнительным преимуществом при выборе Java, является переносимость программ на другие платформы.
Изображение в OpenCV представлено структурой IplImage. Эта структура содержит как числовые значения пикселей, так и параметры изображения. В табл. 1 и 2 приведены перечень параметров структуры IplImage и список других структур:
Перечень параметров структуры IplImage
nChannels | число каналов изображения |
depth | глубина в битах |
width | ширина изображения в пикселях |
height | высота изображения в пикселях |
widthStep | расстояние между соседними по вертикали точками изображения |
Список некоторых структур OpenCV
CvPoint | точка | структура из двух переменных (x,y) |
CvSize | размер | структура из двух переменных (width,height) |
CvRect | прямоугольник | структура из 4 переменных (x,y,width,height) |
CvScalar | скаляр | 4 числа типа double |
CvMat | матрица | |
CvArr | массив |
Почти все функции OpenCV, у которых один или несколько параметров являются указателями на изображение, принимают в качестве параметра также матрицу или массив.
И еще интересные типы данных в OpenCV – это CvMemStorage и CvSeq. CvMemStorage (memory storage) – это хранилищае памяти в методах, для которых требуется хранить динамические объекты. Фактически, хранилище памяти – это связанный список блоков памяти. CvSeq (sequence) последовательность – это двухуровневый двусвязный список некоторых структур, хранящийся в CvMemStorage. Например, Контур в OpenCV представлен как список точек. Но на изображении присутствует несколько контуров, и второй уровень связей в последовательности – это список контуров.
Использование библиотеки OpenCV в полной мере себя оправдало. В частности, нет необходимости выяснять формат изображения на файле. Процедура чтение изображения с файла из библиотеки OpenCV читает достаточно большой набор форматов изображений.
Практически все действия с изображением поддержаны процедурами из библиотеки. Среди таких операций можно упомянуть: нормирование по освещенности, сглаживание изображения, нахождение контура, вычисление выпуклой оболочки контура.
Некоторые действия требуют непосредственного обращения к пикселям изображения. В частности, для сбора некоторых характеристик ядер, потребовалось пройтись в цикле по прямоугольнику, содержащего ядро, и для каждого пикселя, прежде определить, находится ли данный пиксель внутри контура, описывающего ядро или вне, а потом собрать характеристики.
Для проверки правильности работы программы ImgCyto использовались так же разработанные нами ранее [5] тестовые объекты (см. рис. 3). Тестовый объект представляет собой стеклянную пластинку, покрытую слоем хрома. Пропускание подложек варьируется в пределах 0,1 – 0,9. На поверхности хрома нанесены тестовые фигуры в виде кружков и квадратов. Характерные размеры кружков (квадратов) в пленках хрома: 3, 5, 7, 9, 11, 22 мкм. Размер объекта в целом: 2 ✕ 3 мм.
Фотография специального тестового объекта для цитофотометрии
Проводилась обработка изображений тестовых объектов с помощью программы ImgCyto. На рис. 4 показан фрагмент обработанного изображения с выделенными контурами. Геометрические характеристики более чем 300 фигур, полученные в ходе обработки, были сравнены с паспортными характеристиками тестовых объектов. Паспортные данные формировались путем автоматизированного обмера фигур на исследовательском микроскопе DIALUX 20 EB с без-иммерсионным микрообъективом планапохроматом 40 , NA 0,5. Программа выделила все фигуры на изображении. Используемый алгоритм выделения контуров, очевидно отличался от применяемого при составлении паспорта, и найденные размеры фигур на ~5 – 10% меньше паспортных, однако коэффициент вариации данных ImgCyto в 5 раз меньше, чем у паспортных данных.
Изображение фрагмента тестового объекта с выделенными контурами
Использование библиотеки OpenCV позволило в короткий срок создать программу ImgCyto, и полностью себя оправдало. Набор процедур библиотеки достаточно большой, и практически во всех случаях, когда возникала потребность в каких-либо действиях с изображением, находились соответствующие процедуры, обеспечивающие эти действия. Единственным исключением, когда в программе пришлось организовывать доступ к отдельному пикселю, это – вычисления оптической плотности внутри и вне контура.
Использование библиотеки серьезно сокращает время написания и отладки программы. Это обусловлено тем, что процедуры библиотеки содержат зачастую достаточно сложные алгоритмы, и не тратится время на написание и отладку, и в библиотеке хорошо продуманы типы данных и благодаря этому хорошо согласованный интерфейс между процедурами и этот интерфейс достаточно удобен для программиста, который использует библиотеку.