如何在java中执行图像分割?

时间:2010-11-01 07:29:09

标签: java image-processing image-segmentation

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

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

如果您正在开展一项需要生产力,快速验证和撰写报告的研究项目, Matlab 和类似工具是最佳选择。另一方面,如果您正在开发软件产品,则更多地指出 Java,C ++,C,Objective-C等。 Matlab解决方案在生产中不易交付和维护。

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

INPUT IMAGE: enter image description here

输出图片 enter image description here

如何运作

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

    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();  }
    }
    

答案 4 :(得分:0)

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