Что я хотел бы сделать, так это взять изображение нескольких растений и удалить фоновые линии и шум с изображения. Конечный результат, надеюсь, можно будет превратить в бинарное изображение, где каждое 1 значение является лишь частью объекта. Есть ли способ сделать это автоматически без использования ручного порога? Одно решение, которое я рассматривал, — просто оценить значение того, что не является шумом, а затем вычесть, но это приводит к удалению частей растений. Пример изображения для ввода: http://i.imgur.com/utAX6yu.png
Удаление фона с изображения (предпочтительно MATLAB, Java или Python)
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
Ух ты, это работает очень хорошо, и в две строки кода! Благодарю вас!
- person Sam; 17.12.2013
Возможно, мне придется опубликовать второй вопрос, но я не знаю, легко ли ответить на этот вопрос: можно ли дойти до маркировки каждого листа на изображении? Я примерно знаю, как это должно выглядеть, и знаю, где сейчас находится каждое растение.
- person Sam; 17.12.2013
Попробуйте C=bwconncomp(I); I1 = нули (размер (I)); I1 (C.PixelIdxList{k}) = I (C.PixelIdxList{k}); Тогда I1 покажет вам только один лист. В вашем случае k — это число от 1 до 17. Поскольку некоторые из ваших листьев не соединены, общее количество k немного больше, чем ваше число листьев 14.
- person lennon310; 17.12.2013
Это дает мне одно растение. Я хочу получить каждый лист для каждого растения. Я подумал, может быть, найти способ найти кончик каждого листа, используя точки каждой кривой для растения? тогда я знаю, что лист примерно эллиптический, поэтому я мог бы расширяться оттуда.
- person Sam; 17.12.2013
Извините, я перепутал растение и лист как одно и то же. Извлечь лист сложно, потому что у вас нет других очевидных особенностей на изображении. Интенсивность листьев около 255. Я попробовал I=double(I); I1=I.*(I>253); imshow(uint8(I1)), чтобы развалить листья на каждом растении, но это работает не для каждого растения.
- person lennon310; 17.12.2013
Сегментировать каждый лист — непростая задача, так как границы не такие четкие. Решение, показанное ниже, сегментирует несколько листьев, но не все из них. Это простое решение, которое может стать хорошей отправной точкой.
Алгоритм, реализованный с использованием 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();
}
}
person
Gabriel Ambrósio Archanjo
schedule
20.12.2013