Как мне конвертировать программу обработки изображений MATLAB в Java? - PullRequest
10 голосов
/ 22 июня 2009

Я написал программу обработки изображений в MATLAB, которая интенсивно использует MATLAB Image Processing Toolbox, особенно морфологические операции (imopen, imclose), а также imadjust. Мы выполняем много операций подгонки сплайнов, а также много medfilt2 и medfilt1.

У нас есть клиент, который хочет, чтобы мы преобразовали эту программу в Java. Я хотел бы услышать подробное описание библиотеки обработки изображений Java, которая может дублировать функциональные возможности MATLAB в обработке изображений и сплайнах, особенно то, как интерфейс сравнивается с MATLAB.

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

Кроме того, было бы здорово узнать о каких-либо общих хитростях при конвертации между MATLAB и Java.


Редактировать: наше приложение в настоящее время сегментирует изображения относительно простого объекта. Это:

1. Starts with a 3D matrix of gray scale image slices representing a single area
2. Does a medfilt1 to even out each slice. 
3. Does some imopen, imclose and imadjust operations on the image to remove some fuzziness, 
4. Does some simple thresholding in various areas to find boundary points
5. Fits splines to the boundary points, 
6. Uses the 3rd dimension in various ways to further perfect the point matching, especially using medfilt2. 
7. Saves each slice with the boundary splines written in color on it. 

Следует отметить, что мы выполняем «подгонку сплайнов», а не сопоставление сплайнов - подгонка сплайнов - это наименьшее квадратное совпадение с фиксированным числом узлов - сопоставление сплайнов точно совпадает с точками с произвольным числом узлов. Я бы не хотел реализовывать сопоставление сплайнов из более простых функций сплайнов.

MATLAB Builder JA - это вариант, но я хотел бы также знать, что доступно в чистой Java, а также узнать, какие накладные расходы включает в себя Builder JA.


Редактировать 2:

Обратите внимание, что мы выполняем подгонку позвоночника - используя подгонку заданной точки к сплайну как способ решить, следует ли ее устранить - поскольку данные грязные , у нас есть многоэтапный процесс удаления точек, поэтому сплайны являются интегральной частью алгоритма. И так, поскольку я вообще не могу найти упоминания о сплайнах в JAI, поэтому, если кто-нибудь знает библиотеку Java, предлагающую подгонку сплайнов по методу наименьших квадратов, это было бы замечательно.


Редактировать 2.5: Мы используем аппроксимацию набора точек методом наименьших квадратов, используя сплайны с фиксированным числом узлов (0-5 узлов). Если нам придется заново реализовать это, все будет рискованно, поскольку сейчас мы используем библиотеку MATLAB.

И мы, конечно же, не хотим пересматривать алгоритм. Было достаточно сложно получить что-то, что сработало ...

Ответы [ 8 ]

9 голосов
/ 30 июня 2009

Существует несколько основных подводных камней при преобразовании кода Matlab в код Java. Я преобразовал Matlab в код C ++, поэтому мой совет основан на этом опыте.

  1. Если вы используете циклы в Matlab, в общем, вы делаете это неправильно. Добавить матрицы (изображения и т. Д.) Довольно просто:

    a = b + c;

    независимо от размера изображения. Фильтрация также довольно прост:

    a = imfilter («медиана», б); # или как-то так, я сейчас не перед своей машиной Matlab.

    Подобные вызовы функций существуют в JAI (Java Advanced Imaging), поэтому посмотрите, сможете ли вы их найти. Я не знаю специфики ваших требований к медианной фильтрации (я полагаю, что medfilt1 должен быть ядром локальной медианной фильтрации 3x3, а не ядром фильтрации 1D, работающим с данными, потому что это будет означать, что вы фильтруете только в одном направление), поэтому взгляните на то, что есть в документации. Но, если вы напишите свое собственное, указанное выше добавление может быть таким же простым, как цикл с двойным вложением, или сложным классом, который реализует что-то как

    MyMatrix a = MyMatrix.Add (b, c);

    Суть в том, что простота Matlab может затенить все дизайнерские решения, которые вам необходимо принять, чтобы сделать эту эффективную Java-программу.

  2. Помните, когда вы делаете для циклов, Matlab и Java имеют обратный порядок строк / столбцов. Matlab - главный столбец, а java - главный ряд . Вам нужно будет переписать ваши циклы, чтобы учесть это изменение, иначе ваш код будет работать медленнее, чем должен быть.

  3. Лично я бы старался избегать JAI, за исключением определенных операций, которые мне нужно было выполнить. Например, просто используйте его для медианных операций фильтрации и так далее. Я считаю, что его использование - это оптимизация, но это только потому, что я работаю в Old School и в первую очередь пишу свои собственные операции по обработке изображений. Если вы выберете такой подход, вы можете написать свой код, чтобы он был именно тем, что вы хотите, а затем вы можете добавить в вызовы JAI и убедиться, что вывод соответствует тому, что уже делает ваш код. Проблема с использованием расширенных библиотек, таких как JAI или Intel IPP в C ++, заключается в том, что существует множество специфичных для библиотеки проблем (например, мозаика или то, выделяется ли каждая строка как растровое изображение с несколькими дополнительными пикселями в конце или другие подобные детали), и вы не хотите иметь дело с этими проблемами, в то же время перемещая свой код. JAI быстр, но это не волшебная пуля; если вы не знаете, как его использовать, лучше убедиться, что у вас что-то есть, прежде чем вы что-то быстро.

  4. Если я смогу немного прочитать между строк, похоже, что вы выполняете некоторую сегментацию данных медицинской визуализации. Я не знаю, что такое java-библиотеки для чтения в DICOM-изображениях, но gdcm хорошо работает для C ++ и C #, а также имеет оболочки java. Matlab скрывает простоту обработки изображений, особенно обработки изображений DICOM, поэтому вам может понадобиться изучить некоторую библиотеку DICOM для обработки манипуляций с файлами изображений. За эти годы я выучил небольшую часть стандарта DICOM; спецификация является чрезвычайно полной, возможно, чрезмерной, но вы можете понять, как делать то, что вам нужно, в мучительных деталях. Если вы пытаетесь выполнить сегментацию медицинских данных, сохранение сплайна на данных - это неправильная вещь, чтобы ваши изображения работали с другими устройствами чтения DICOM. Посмотрите, как указаны контуры.

Изменить в ответ на дополнительную информацию:

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

Вместо этого я бы проверил Числовые Рецепты, в частности Глава 3 , для кода на фитинг сплайна. Код основан на одном, а не на нуле, поэтому он требует некоторого перевода, но это вполне выполнимо.

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

Редактировать 2.5: Если под подборкой сплайнов из предоставленной библиотеки вы имеете в виду что-то вроде этот код ? Если худшее приходит к худшему, у вас по крайней мере будет исходный код. Если вам в конечном итоге придется делать что-то вроде этого, другой очень полезный совет - Matlab - все удваивается, и ничего больше, если только вы не форсируете его (и даже в этом случае многие операции не работают с двойными числами). Таким образом, вам нужно будет делать свой код также в двойном порядке, чтобы поддерживать разумное соглашение. Я также сделал бы несколько тестов. Если вы в конечном итоге переписываете этот код (или что-то в этом роде), наличие группы известных входных данных и ожидаемых выходных данных (в пределах некоторого разумного предела погрешности, когда вы должны определить, что означает «разумный»), будет иметь решающее значение для обеспечения того, чтобы колесо, которое вы копируете (на самом деле не заново изобретаете), имеет те же повороты на расстоянии, что и оригинал. Вероятно, в последнем предложении слишком много паратетических выражений.

Еще одно редактирование: если все вышеперечисленное - слишком большая головная боль, то подумайте, что сборщик JA уже указал. В противном случае, подход, который я обрисовал в общих чертах, или что-то подобное, вероятно, будет тем местом, где вы окажетесь.

4 голосов
/ 26 июня 2009

Как насчет использования MATLAB Builder JA , предоставленного самой MathWorks, которая является разработчиком самой MATLAB .?

3 голосов
/ 02 июля 2009

Когда я в прошлом конвертировал код MATLAB в код Java, я обнаружил, что библиотеки CERN COLT очень полезны. Они не будут обрабатывать ваши изображения, но они сэкономили мне много времени, поскольку очень быстро конвертировали матричный математический код.

2 голосов
/ 26 июня 2009

Без явного решения вопроса Matlab вы должны взглянуть на ImageJ . Это Java-приложение с открытым исходным кодом, содержащее множество подключаемых модулей для анализа и обработки изображений. Медианная фильтрация встроена.

Самая большая проблема, с которой я столкнулся при конвертации Matlab в Java, заключается в том, что вы будете писать много циклов для обработки функций, которые в Matlab являются одной строкой.

Если вы сможете более подробно описать свои сплайн-операции, я, скорее всего, смогу получить информацию о том, какие операции ImageJ вам нужны.

Пример фитинга сплайна в Java: http://www.mste.uiuc.edu/exner/java.f/leastsquares/

1 голос
/ 29 июня 2009

Вы можете скомпилировать скрипт MATLAB, чтобы он выполнялся независимо. Это работает не во всех случаях, но если это так, вы можете оставить свой быстрый код MATLAB в покое и попытаться вызвать процессор изображений из Java.

http://www.mathworks.com/products/compiler/

1 голос
/ 27 июня 2009

Только не делай этого таким образом . Я собирался порекомендовать вам выяснить, что Weka использует для реализации матричных операций (я никогда не использовал это), но я полагаю, что для этого может не использоваться другая библиотека. Даже если это так, оно не может быть похожим на matlab или поддерживать изображения.

0 голосов
/ 26 июня 2009

Как правило, операции по обработке изображений отнимают много времени, поэтому они часто реализуются в C или C ++ ради скорости, поэтому неудивительно, что у вас возникают проблемы с поиском кода Java для того, что вам нужно. Возможно, вам придется бросить свои собственные хотя бы для некоторых из них. Упомянутые вами операции, такие как морфология или срединные фильтры, хорошо документированы и довольно просты в реализации, особенно если у вас есть функции matlab, с которыми можно ознакомиться и проверить.

0 голосов
/ 22 июня 2009

Я полагаю, Raster.getPixels и WritableRaster.setPixels позволяют изменять вид пиксельных данных, о котором вы говорите.

Я не собираюсь делать вид, что этот порт будет простым.

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