3

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

4

2 回答 2

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

在此处输入图像描述

于 2013-12-17T17:00:26.447 回答
0

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

该算法使用Marvin 框架实现:

  1. 反转图像颜色
  2. 二值化
  3. 形态侵蚀
  4. 形态扩张

在原始图像下方,二值图像和一些叶子被分割。

在此处输入图像描述

源代码:

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();
    }
}
于 2013-12-20T13:06:02.063 回答