Удаление фона с изображения (предпочтительно MATLAB, Java или Python)

Что я хотел бы сделать, так это взять изображение нескольких растений и удалить фоновые линии и шум с изображения. Конечный результат, надеюсь, можно будет превратить в бинарное изображение, где каждое 1 значение является лишь частью объекта. Есть ли способ сделать это автоматически без использования ручного порога? Одно решение, которое я рассматривал, — просто оценить значение того, что не является шумом, а затем вычесть, но это приводит к удалению частей растений. Пример изображения для ввода: http://i.imgur.com/utAX6yu.png


person Sam    schedule 17.12.2013    source источник
comment
Я бы свернулся с гауссовым, чтобы удалить крапинки, а затем сделал бы некоторое обнаружение края   -  person NeplatnyUdaj    schedule 17.12.2013
comment
@NeplatnyUdaj Это кажется довольно запутанным, возможно, сначала свёртывается с гауссовым. ;)   -  person chappjc    schedule 17.12.2013
comment
Ага. Сворачивать — правильное слово. Каждый день узнаю что-то новое :) Спасибо   -  person NeplatnyUdaj    schedule 17.12.2013


Ответы (2)


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

введите здесь описание изображения

person lennon310    schedule 17.12.2013
comment
Ух ты, это работает очень хорошо, и в две строки кода! Благодарю вас! - person Sam; 17.12.2013
comment
Возможно, мне придется опубликовать второй вопрос, но я не знаю, легко ли ответить на этот вопрос: можно ли дойти до маркировки каждого листа на изображении? Я примерно знаю, как это должно выглядеть, и знаю, где сейчас находится каждое растение. - person Sam; 17.12.2013
comment
Попробуйте C=bwconncomp(I); I1 = нули (размер (I)); I1 (C.PixelIdxList{k}) = I (C.PixelIdxList{k}); Тогда I1 покажет вам только один лист. В вашем случае k — это число от 1 до 17. Поскольку некоторые из ваших листьев не соединены, общее количество k немного больше, чем ваше число листьев 14. - person lennon310; 17.12.2013
comment
Это дает мне одно растение. Я хочу получить каждый лист для каждого растения. Я подумал, может быть, найти способ найти кончик каждого листа, используя точки каждой кривой для растения? тогда я знаю, что лист примерно эллиптический, поэтому я мог бы расширяться оттуда. - person Sam; 17.12.2013
comment
Извините, я перепутал растение и лист как одно и то же. Извлечь лист сложно, потому что у вас нет других очевидных особенностей на изображении. Интенсивность листьев около 255. Я попробовал I=double(I); I1=I.*(I>253); imshow(uint8(I1)), чтобы развалить листья на каждом растении, но это работает не для каждого растения. - person lennon310; 17.12.2013

Сегментировать каждый лист — непростая задача, так как границы не такие четкие. Решение, показанное ниже, сегментирует несколько листьев, но не все из них. Это простое решение, которое может стать хорошей отправной точкой.

Алгоритм, реализованный с использованием Marvin Framework:

  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();
    }
}
person Gabriel Ambrósio Archanjo    schedule 20.12.2013