Как я преобразовываю программу обработки изображений MATLAB в Java?

Я использовал Struts из Джакарты (группа Apache) для Java, и это действительно хорошо. Хорошее разделение слоев, которое позволяет использовать любую библиотеку / инфраструктуру в любом слое, например Hibernate для объектно-реляционного отображения или даже любую шаблонную структуру, такую ​​как Velocity в слое вида.

Я рекомендую вам взглянуть на их веб-сайт

10
задан Joe Soul-bringer 2 July 2009 в 03:04
поделиться

8 ответов

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

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

    a = b + c;

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

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

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

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

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

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

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

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

Отредактируйте в ответ на дополнительную информацию:

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

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

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

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

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

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

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

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

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

9
ответ дан 3 December 2019 в 19:34
поделиться

Я считаю, что Raster.getPixels и WritableRaster.setPixels допускают вид модификации данных пикселей, о которой вы говорите.

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

0
ответ дан 3 December 2019 в 19:34
поделиться

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

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

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

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

2
ответ дан 3 December 2019 в 19:34
поделиться

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

0
ответ дан 3 December 2019 в 19:34
поделиться

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

4
ответ дан 3 December 2019 в 19:34
поделиться

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

1
ответ дан 3 December 2019 в 19:34
поделиться

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

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

1
ответ дан 3 December 2019 в 19:34
поделиться

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

3
ответ дан 3 December 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: