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

Posted

技术标签:

【中文标题】从图像中删除背景(首选 MATLAB、Java 或 Python)【英文标题】:Removing background from image (MATLAB, Java, or Python preferred) 【发布时间】:2014-01-05 13:31:28 【问题描述】:

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

【问题讨论】:

我会用高斯卷积去除斑点,然后做一些边缘检测 @NeplatnyUdaj 这似乎相当convoluted,也许首先与高斯卷积。 ;) 是的。卷积是正确的词。每天我都会学到一些新东西:) 谢谢 【参考方案1】:
I=im2bw(I,graythresh(I));
imshow(I)

【讨论】:

哇哦,效果真的很好,而且只有两行代码!谢谢! 我可能需要发布第二个问题,但我不知道这是否也是一个容易回答的问题:是否可以尽可能地标记图像中的每一片叶子?我大致知道它应该是什么样子,并且我知道每株植物现在在哪里。 试试 C=bwconncomp(I); I1=零(大小(I)); I1(C.PixelIdxListk)=I(C.PixelIdxListk); I1 将只向您显示一片叶子。在您的情况下,k 是从 1 到 17 的数字。由于您的某些叶子没有连接,因此 k 的总数略大于您的叶子编号 14。 这给了我一株植物。我想做的是为每种植物获取每一片叶子。我在想也许找到一种方法来使用植物的每条曲线的点找到每片叶子的尖端?然后我知道一片叶子大约是椭圆形的,所以我可以从那里展开。 对不起,我把植物和叶子混淆了。提取叶子具有挑战性,因为图像中没有其他明显的特征。叶子的强度都在 255 左右。我试过 I=double(I); I1=I.*(I>253); imshow(uint8(I1)),将每株植物的叶子分开,但不适用于每株植物。【参考方案2】:

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

算法,使用Marvin Framework实现:

    反转图像颜色 二值化 形态侵蚀 形态扩张

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

源代码:

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

【讨论】:

以上是关于从图像中删除背景(首选 MATLAB、Java 或 Python)的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Flash 导出的 HTML 和 JS 中删除背景图像或颜色

如何使用自定义背景图像从 UINavigationBar 和 UIToolbar 中删除圆角?

目标跟踪基于背景消减的图像帧间差分法目标检测及matlab仿真

如何在android java中使用人类删除图像中的背景

从图像中去除背景和噪点

在 Matlab 中删除图像偏移(2D 基线)