如何将MATLAB图像处理程序转换为java?

Joe*_*ger 10 java matlab image-processing

我在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. 
Run Code Online (Sandbox Code Playgroud)

我应该注意到,我们正在进行"样条拟合"而不是样条匹配 - 样条拟合是一个最小平方匹配的固定数量的结 - 样条匹配精确匹配点与任意数量的结.我不想从更简单的样条函数实现样条匹配.

MATLAB的Builder JA是一个选项,但我想知道纯Java中可用的内容,以及了解Builder JA涉及的开销类型.


编辑2:

请注意,我们正在进行脊柱拟合 - 使用给定点适合样条曲线作为决定是否消除它的方法 - 因为数据很乱,我们有一个多步骤点消除过程,因此样条曲线是其中不可或缺的一部分.算法.因此,由于我根本无法在JAI中找到任何样条线,所以如果有人知道提供最小二乘样条拟合的java库,那就太棒了.


编辑2.5:我们使用具有固定结节数(0-5节)的样条曲线使用一组点的最小二乘近似.如果我们必须重新实现它,事情会变得冒险,因为现在我们正在使用MATLAB贡献的库.

我们当然不想重新审视算法.得到一些有用的东西真的很难......

mmr*_*mmr 9

将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建设者已经指出.否则,我概述的方法或类似的方法可能就是你最终的方向.