从图像中删除背景(首选MATLAB,Java或Python)

时间:2013-12-17 16:52:41

标签: java python matlab image-processing noise-reduction

我想做的是拍摄几株植物的图像,并从图像中去除背景线和噪点。最终结果将有望变成二进制图像,其中每1个值只是工厂的一部分。有没有办法让我自动执行此操作而无需使用手动阈值?我研究过的一个解决方案就是估计不是噪声的值然后减去,但这会导致部分植物被移除。输入的示例图像是:http://i.imgur.com/utAX6yu.png

2 个答案:

答案 0 :(得分:3)

I=im2bw(I,graythresh(I));
imshow(I)

enter image description here

答案 1 :(得分:0)

分割每个叶子并不是一件容易的事,因为边界不是很清楚。下面显示的解决方案分割了几片叶子,但不是全部。这是一个简单的解决方案,可能是一个很好的起点。

该算法使用Marvin Framework实现:

  1. 反转图像颜色
  2. 二值化
  3. 形态侵蚀
  4. 形态膨胀
  5. 在原始图像下方,二进制图像和一些叶子被分割。

    enter image description here

    源代码:

    public class RemoveBackground {
    
        public RemoveBackground(){
            // 1. Load plug-ins
            MarvinImagePlugin erode = MarvinPluginLoader.loadImagePlugin("org.marvinproject.image.morphological.erosion");
            MarvinImagePlugin dilate = MarvinPluginLoader.loadImagePlugin("org.marvinproject.image.morphological.dilation");
            MarvinImagePlugin invert = MarvinPluginLoader.loadImagePlugin("org.marvinproject.image.color.invert");
    
            // 2. Set plug-ins attributes
            boolean[][] m = MarvinMath.getTrueMatrix(15,15);
            erode.setAttribute("matrix", m);
            dilate.setAttributes("matrix", m);
    
            // 3. Load and process the image
            MarvinImage image = MarvinImageIO.loadImage("./res/flowers.png");
            invert.process(image.clone(), image);
            MarvinImage binImage = MarvinColorModelConverter.rgbToBinary(image, 127);
            MarvinImageIO.saveImage(binImage, "./res/flowers_bin.png");
            erode.process(binImage.clone(), binImage);
            dilate.process(binImage.clone(), binImage);
            MarvinImageIO.saveImage(binImage, "./res/flowers_out.png");
        }
    
        public static void main(String[] args) {
            new RemoveBackground();
        }
    }