Ответ 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. В противном случае подход, который я изложил, или что-то подобное, вероятно, будет там, где вы закончите.