【问题标题】:how to perform the image segmentation in java?如何在java中执行图像分割?
【发布时间】:2011-05-03 07:22:37
【问题描述】:

大家好,我是 Java 图像处理技术的婴儿,我决定开发一个图像处理项目,所以我需要遵循哪些算法以及哪个更容易开发,请有人指导我对我来说很棒......还有哪种技术最适合图像处理java或Matlab?指导我...

【问题讨论】:

    标签: java image-processing image-segmentation


    【解决方案1】:

    MATLAB 更适合图像处理。而最好的方法是找到专门的图像处理工具(或库)。

    【讨论】:

      【解决方案2】:

      您可以使用Java Advanced Imaging (JAI) 库在java 中进行图像处理。您必须自己决定是 Java 还是 MATLAB 更适合您。

      【讨论】:

        【解决方案3】:

        对于 JAVA 中的图像分割,您还可以考虑使用开源 IMMI 工具 (http://spl.utko.feec.vutbr.cz/en/)。与 Matlab 相比,它(在我看来)更易于使用,并且还可以简单地进行图像挖掘。

        【讨论】:

          【解决方案4】:

          图像分割算法取决于分割后您想要的输出类型。每种算法执行不同的分割。我认为该区域正在增长或Flood Fill 有利于此目的。 您可以将 Java/JAI 和 JavaCV 用于此图像处理任务。

          【讨论】:

            【解决方案5】:

            我认为最适合您的图像处理工具取决于您从事的项目类型。

            如果您正在从事需要生产力、快速验证和撰写报告的研究项目,Matlab 和类似工具是最佳选择。另一方面,如果你正在开发一个软件产品,Java、C++、C、Objective-C 等更为适用。 Matlab 解决方案在生产环境中不易交付和维护。

            由于您询问如何在 Java 中进行图像分割,我将提供一个使用 Java 和Marvin Image Processing Framework 的示例。正如@Asif Sharif 所建议的,FloodFill 分割是一个很好的策略,我使用了它!

            输入图片:

            输出图像:

            工作原理:

            1. 加载输入图像。
            2. 将绿色像素更改为白色像素。
            3. 应用强度阈值来分离前景与背景。
            4. 对同一对象的分离部分应用形态闭合
            5. 使用 FloodFill 分段获取分段。
            6. 在原始图像中绘制线段坐标。

            来源:

            import static marvin.MarvinPluginCollection.*;
            
            public class SimpleSegmentation {
                public SimpleSegmentation(){
                    // 1. Load image
                    MarvinImage original = MarvinImageIO.loadImage("./res/robocup.jpg");
                    MarvinImage image = original.clone();
                    // 2. Change green pixels to white
                    filterGreen(image);
                    // 3. Use threshold to separate foreground and background.
                    MarvinImage bin = MarvinColorModelConverter.rgbToBinary(image, 127);
                    // 4. Morphological closing to group separated parts of the same object
                    morphologicalClosing(bin.clone(), bin, MarvinMath.getTrueMatrix(30, 30));
                    // 5. Use Floodfill segmention to get image segments
                    image = MarvinColorModelConverter.binaryToRgb(bin);
                    MarvinSegment[] segments = floodfillSegmentation(image);
                    // 6. Show the segments in the original image
                    for(int i=1; i<segments.length; i++){
                        MarvinSegment seg = segments[i];
                        original.drawRect(seg.x1, seg.y1, seg.width, seg.height, Color.yellow);
                        original.drawRect(seg.x1+1, seg.y1+1, seg.width, seg.height, Color.yellow);
                    }
                    MarvinImageIO.saveImage(original, "./res/robocup_segmented.png");
                }
                private void filterGreen(MarvinImage image){
                    int r,g,b;
                    for(int y=0; y<image.getHeight(); y++){
                        for(int x=0; x<image.getWidth(); x++){
                            r = image.getIntComponent0(x, y);
                            g = image.getIntComponent1(x, y);
                            b = image.getIntComponent2(x, y);
                            if(g > r*1.5 && g > b*1.5){
                                image.setIntColor(x, y, 255,255,255);
                    }}}
                }
                public static void main(String[] args) { new SimpleSegmentation();  }
            }
            

            【讨论】:

            • 错误解析失败:Ljavax/imageio/ImageIO;帮助。
            猜你喜欢
            • 1970-01-01
            • 2020-02-10
            • 1970-01-01
            • 2015-04-28
            • 2012-05-15
            • 2022-10-17
            • 1970-01-01
            • 2011-12-21
            • 2012-07-10
            相关资源
            最近更新 更多