Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
 
 
主题工具 显示模式
旧 2019-12-10, 16:49   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 如何将MATLAB图像处理程序转换为Java?

我已经在MATLAB中编写了一个图像处理程序,该程序大量使用了MATLAB图像处理工具箱,尤其是形态运算(imopen,imclose)以及不适当的调整。我们执行了很多样条拟合操作,并且也执行了medfilt2和medfilt1。

我们有一个客户希望我们将此程序转换为Java。我想听听Java图像处理库的详细说明,该库可以复制MATLAB在图像处理和样条曲线中的功能,尤其是接口与MATLAB的比较方式。

我已经阅读了有关Java的高级图像处理库的信息,但是在Web上找不到任何详细的文档。另外,我所读过的小文档似乎表明它使用了一个相当复杂的图像模型,将它们组合成图块等等。如果有一个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); #或类似的东西,我现在不在我的matlab机器前。

    JAI(Java高级映像)中也存在类似的函数调用,因此请查看是否可以找到它们。我不知道您的中值过滤要求的具体细节(我假设medfilt1是一个3x3本地中值过滤内核,而不是对数据运行的1D过滤内核,因为那意味着您仅在一个过滤中方向),因此请查看文档的内容。但是,如果您编写自己的代码,则上述添加操作可能像是双重嵌套的for循环一样简单,也可能是实现类似以下内容的复杂类

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

    我的观点是,Matlab的简单性会使您为了使之成为高效的Java程序而需要做出的所有设计决策都难以理解。
  2. 请记住,当您执行for循环时,matlab和java的行/列顺序相反。 Matlab是column-major,而java是row-major 。您将需要重写循环以将更改考虑在内,否则您的代码将比预期的慢。
  3. 就我个人而言,除了需要完成的特定操作外,我倾向于避免使用JAI。例如,仅将其用于中值滤波操作等等。我认为使用它是一种优化,但这仅仅是因为我是老派,并且倾向于先编写自己的图像处理操作。如果采用这种方法,则可以编写所需的代码,然后添加JAI调用,并确保输出与代码已完成的功能匹配。使用C ++中的JAI或Intel IPP之类的高级库的问题在于,存在许多特定于库的陷阱(例如平铺,或者是否每一行都像位图一样分配,最后还带有一些额外的像素,或其他此类详细信息),并且您不希望在移动代码的同时处理这些问题。 JAI速度很快,但这不是灵丹妙药。如果您不知道如何使用它,最好先确定自己已经掌握了一些东西,然后再快速掌握。
  4. 如果我可以在两行之间一点一点地阅读,似乎您正在对医学成像数据进行某种分割。我不知道在DICOM图像中读取的Java库是什么,但是gdcm对于C ++和C#效果很好,并且还具有Java包装器。 Matlab使图像处理(尤其是DICOM图像)的处理变得容易,因此您可能发现自己必须学习一些DICOM库才能处理图像文件操作。这些年来,我已经学会了DICOM标准的一小部分。 规范非常完整,也许过于严格,但是您可以找出如何做需要做的事情。如果要对医学数据进行分割,则将样条线保存在数据上不是正确的做法,以使您的图像可与其他DICOM阅读器一起使用。看看指定轮廓的方式。
根据更多信息进行编辑:

样条拟合可能最好通过数字方法而不是库方法来完成。在JAI中可能有一种方法可以做到这一点,但是我对这种语言还不够熟悉。

取而代之的是,我会查阅《数字配方》,特别是第3章 ,以获得有关样条曲线拟合的代码。该代码基于一个代码,而不是基于零的代码,因此需要进行一些翻译,但这是完全可行的。

如果要尝试从边界中删除噪声点,则可能还需要尝试模糊化最初从中获得噪声点的边缘。在不知道要尝试进行样条拟合的情况下(有多种变体),很难推荐另一种语言的完全相同的样条。

编辑2.5:如果通过贡献库中的样条拟合,您是说类似此代码 ?如果情况变得更糟,那么您至少会拥有源代码。如果您最终不得不做这样的事情,那么另一个非常有用的提示是Matlab都是双精度的,除非您强行使用它,否则别无其他(即使那样,很多运算对非双精度也不起作用)。因此,您还需要将代码加倍以保持合理的协议。我还要进行几次测试。如果您确实要重写该代码(或类似的代码),那么拥有一组已知的输入和预期的输出(在一定的合理误差范围内,必须定义“合理”的意思)对于确保您要复制的轮子(不是真正重塑的轮子)的每转距离与原始转数相同。最后一句中可能有太多的名词表达。

另一个修改:如果上述所有内容都令人头疼,那么考虑一下JA构建器已指出的问题。否则,我概述的方法或类似方法可能会成为您最终的选择。



更多&回答...
poster 当前离线   回复时引用此帖
 


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 23:26


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.