簡體   English   中英

如何將MATLAB圖像處理程序轉換為java?

[英]How do I convert a MATLAB image processing program to java?

我在MATLAB中編寫了一個圖像處理程序,它大量使用MATLAB圖像處理工具箱,特別是形態學操作(imopen,imclose)以及imadjust。 我們也做了很多樣條擬合操作和medfilt2和medfilt1。

我們有一個客戶希望我們將此程序轉換為Java。 我想聽一下Java圖像處理庫的詳細描述,它可以復制MATLAB在圖像處理和樣條函數中的功能,特別是界面與MATLAB的比較。

我已經閱讀了Java的高級圖像處理庫,但我無法在網上找到任何詳細的文檔。 此外,我讀過的關於它的小文檔似乎表明它使用了相當復雜的圖像模型,將它們組合成瓷磚等等。 如果有一個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:

請注意,我們正在進行脊柱擬合 - 使用給定點適合樣條曲線作為決定是否消除它的方法 - 因為數據很亂 ,我們有一個多步點消除過程,因此樣條曲線是其中不可或缺的一部分。算法。 因此,由於我根本無法在JAI中找到任何樣條線,所以如果有人知道提供最小二乘樣條擬合的java庫,那就太棒了。


編輯2.5:我們使用具有固定結節數(0-5節)的樣條曲線使用一組點的最小二乘近似。 如果我們必須重新實現它,事情會變得冒險,因為現在我們正在使用MATLAB貢獻的庫。

我們當然不想重新審視算法。 得到一些有用的東西真的很難......

將Matlab代碼轉換為Java代碼有幾個常見的缺陷。 我已經將Matlab轉換為C ++代碼,所以我的建議來自於這些經驗。

  1. 如果你在Matlab中使用for循環,一般來說,你做錯了。 添加矩陣(圖像等)非常簡單:

    a = b + c;

    無論圖像的大小。 過濾也是一個相當簡單的電話:

    a = imfilter('median',b); #or這樣的東西,我現在不在我的matlab機器前面。

    JAI(Java高級成像)中存在類似的函數調用,因此請查看是否可以找到它們。 我不知道你的中值過濾要求的細節(我假設medfilt1是3x3本地中值過濾內核,而不是在數據上運行的1D過濾內核,因為這意味着你只在一個過濾方向),所以看一下文檔的內容。 但是,如果你自己編寫,上面的添加可以像雙重嵌套for循環一樣簡單,或者是一個復雜的類來實現像

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

    我的觀點是,Matlab的簡單性可能會掩蓋您需要做出的所有設計決策,以使其成為一個高效的Java程序。

  2. 請記住,當您為循環執行操作時,matlab和java具有反向行/列順序。 Matlab是專欄專業,java是行專業 您需要重寫您的循環以將該更改考​​慮在內,否則您的代碼將比它應該更慢。

  3. 就個人而言,除了我需要完成的具體操作外,我傾向於避開JAI。 例如,只需將其用於中值濾波操作等。 我認為使用它是一種優化,但這只是因為我是Old School並且傾向於首先編寫我自己的圖像處理操作。 如果你采用這種方法,你可以編寫你想要的代碼,然后你可以添加JAI調用並確保輸出與你的代碼已經匹配。 在C ++中使用JAI或Intel IPP等高級庫的問題在於,存在許多特定於庫的陷阱(如平鋪,或者每行是否像位圖一樣分配,最后有一些額外的像素,或其他此類細節),並且您不希望在移動代碼的同時處理這些問題。 JAI很快,但它不是一個神奇的子彈; 如果你不知道如何使用它,最好確保在你得到快速的東西之前得到一些東西。

  4. 如果我可以在線條之間稍微閱讀,看起來你正在對醫學成像數據進行某種分割。 我不知道在DICOM圖像中讀取的Java庫是什么,但gdcm適用於C ++和C#,還有java包裝器。 Matlab模糊了圖像處理的簡易性,特別是DICOM圖像處理,因此您可能會發現自己必須學習一些DICOM庫才能處理圖像文件操作。 多年來我學到了DICOM標准的一小部分; 規范非常完整,可能過於嚴格,但你可以弄清楚如何在令人難以忍受的細節中做你需要做的事情。 如果您正在嘗試對醫療數據進行分段,則將樣條保存在數據上並不是正確的做法,因此您的圖像可以與其他DICOM讀取器一起使用。 看一下輪廓的指定方式。

編輯以回復更多信息:

樣條擬合最好用數值方法而不是庫方法完成。 在JAI中可能有一種方法可以做到這一點,但我對語言不夠熟悉。

相反,我會查看Numerical Recipes,特別是第3章 ,了解樣條擬合的代碼。 代碼是基於一個,而不是基於零,所以它需要一些翻譯,但它完全可行。

如果您嘗試從邊界移除噪點,您可能還想嘗試模糊您最初從中獲取點的邊。 如果不知道你想要做的樣條擬合(有很多變化),就很難推薦另一種語言的精確等價物。

編輯2.5:如果通過擬合庫中的樣條擬合,你的意思是這樣的代碼嗎? 如果最壞的情況發生,你至少要有源代碼。 如果你最終不得不做這樣的事情,另一個非常有用的提示是Matlab都是雙打,除非你強迫它,否則沒有別的東西(即便如此,很多操作都不適用於非雙打)。 因此,您還需要在雙打中執行代碼,以保持合理的協議。 我也做了幾次測試。 如果你最終重寫了那段代碼(或類似代碼),那么擁有一組已知輸入和預期輸出(在一些合理的誤差范圍內,你必須定義'合理'的含義)對於確保你正在復制的輪子(不是真正重新發明)每個距離的旋轉與原始輪子相同。 在最后一句話中可能有太多的paranthetical表達。

另一個編輯:如果上述所有內容都太令人頭疼,那么請考慮JA建設者已經指出。 否則,我概述的方法或類似的方法可能就是你最終的結果。

如何使用MathWorks本身提供的MATLAB Builder JA ,它是MATLAB本身的開發人員。

當我在過去將MATLAB代碼轉換為Java代碼時,我發現CERN COLT庫非常有用。 他們不會進行圖像處理,但通過快速轉換矩陣數學代碼,他們節省了大量時間。

如果沒有明確地解決Matlab問題,你應該看一下ImageJ 這是一個開源Java應用程序,有許多用於圖像分析和操作的插件。 內置中值過濾。

我將Matlab轉換為Java的最大問題是你將編寫許多循環來處理Matlab中的一行函數。

如果您可以更詳細地描述樣條操作,我很可能會向您提供有關您需要哪些ImageJ操作的信息。

java中樣條擬合的示例: http//www.mste.uiuc.edu/exner/java.f/leastsquares/

只是不要做這種方式 我打算建議你找出Weka用來實現矩陣運算的東西(我從未使用它),但我想它可能不會使用另一個庫。 即使它確實如此,也可能不像matlab,也不支持圖像。

您可以編譯MATLAB腳本以使其獨立運行。 這並不適用於所有情況,但如果確實如此,您可以單獨保留快速MATLAB代碼並嘗試從Java調用圖像處理器。

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

我相信Raster.getPixelsWritableRaster.setPixels允許你正在談論的那種像素數據修改。

不過,我不打算假裝這個端口很簡單。

通常,圖像處理操作非常耗時,因此為了提高速度,它們通常用C或C ++實現,因此您無法找到所需內容的Java代碼也就不足為奇了。 您可能最終不得不為至少其中一些人推出自己的產品。 您提到的操作(如形態學或中值濾波器)已有詳細記錄,並且實現起來相當簡單,尤其是當您具有要查看和測試的matlab函數時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM