Как преобразовать программу обработки изображений MATLAB в java?

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

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

Я читал о Java Advanced Image Processing Library, но мне не удалось найти в Интернете подробную документацию. Кроме того, небольшая документация, о которой я читал, кажется, указывает на то, что она использует довольно сложную модель изображений, объединяя их в плитку и так далее. Было бы здорово, если бы была библиотека Java, которая позволила мне продолжать обрабатывать изображения с серой шкалой только как 2D или 3D-массивы.

Кроме того, было бы замечательно узнать о любых общих ошибках при конвертации между 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:

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


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

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

Ответ 1

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

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

    a = b + c;

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

    a = imfilter ('median', b); # или что-то вроде этого, я не нахожусь перед моей машиной matlab в данный момент.

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

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

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

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

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

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

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

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

Вместо этого я проверил Numerical Recipes, в частности Глава 3, для кода на сплайн-фитинге. Код основан на одном, а не на нулевом, поэтому для него требуется некоторый перевод, но он полностью выполним.

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

Я не буду притворяться, что этот порт будет прост.

Ответ 8

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