Извлеките один объект из группы объектов и обнаружите края

Для моего студенческого проекта мне нужно определить вид растения по форме листа растения, определяя края листа. (Я использую OpenCV 2.4.9 и C ++), но исходное изображение было снято в реальной среде растения и имеет более одного листа. См. Изображение ниже. Итак, здесь мне нужно извлечь краевой узор только одного листа для дальнейшей обработки.

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

Используя Canny Edge Detector, я могу идентифицировать края всего изображения.

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

Но я не знаю, как дальше извлекать краевой узор всего одного листа, может быть более четкий и полный лист. Я не знаю, возможно ли это тоже. Может ли кто-нибудь сказать мне, возможно ли это, как извлечь края одного листа, я просто хочу знать шаги обработки изображения, которые мне нужно применить к изображению. Мне не нужны образцы кода. Я новичок в обработке изображений и OpenCV и учусь на экспериментах.

Заранее спасибо.

Изменить

Как сказал Луис, я сделал морфологию близко к изображению после обнаружения краев с помощью Canny edge detection, но, похоже, мне все еще трудно найти самый большой контур на изображении. Вот шаги, которые я предпринял для обработки изображения

  1. Примените двусторонний фильтр, чтобы уменьшить шум

    bilateralFilter(img_src, img_blur, 31, 31 * 2, 31 / 2);
    
  2. Отрегулируйте контраст путем выравнивания гистограммы

    cvtColor(img_blur,img_equalized,CV_BGR2GRAY);
    
  3. Применить детектор края Canny

    Canny(img_equalized, img_edge_detected, 20, 60, 3);
    
  4. Пороговое двоичное изображение для удаления некоторых фоновых данных

    threshold(img_edge_detected, img_threshold, 1, 255,THRESH_BINARY_INV);
    
  5. Морфологическая близость изображения

    morphologyEx(img_threshold, img_closed, MORPH_CLOSE, getStructuringElement(MORPH_ELLIPSE, Size(2, 2)));
    

Ниже приведены результирующие изображения, которые я получаю.

Этот результат я получаю для исходного изображения выше

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

Исходное изображение и результат для второго изображения

Источник :

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

Результат :

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

Есть ли способ определить самый крупный контур и извлечь его из изображения?

Обратите внимание, что моя конечная цель - создать систему идентификации растений с использованием реального изображения окружающей среды, но здесь я не могу использовать сопоставление шаблонов или маскировку, потому что пользователь должен взять изображение и загрузить его, чтобы система не имела никакого предварительного представления о листе.

Вот полный код

#include <opencv\cv.h>
#include <opencv\highgui.h>
using namespace cv;

int main()
{
Mat img_src,     img_blur,img_gray,img_equalized,img_edge_detected,img_threshold,img_closed;
//Load original image
img_src = imread("E:\\IMAG0196.jpg");

//Apply Bilateral Filter to reduce noise
bilateralFilter(img_src, img_blur, 31, 31 * 2, 31 / 2);

//Adjust contrast by histogram equaliztion
cvtColor(img_blur,img_equalized,CV_BGR2GRAY);

//Apply Canny edge detector
Canny(img_equalized, img_edge_detected, 20, 60, 3);

//Threshold binary image to remove some background data
threshold(img_edge_detected, img_threshold, 15, 255,THRESH_BINARY_INV);

//Morphological close of the image
morphologyEx(img_threshold, img_closed, MORPH_CLOSE, getStructuringElement(MORPH_ELLIPSE, Size(2, 2)));

imshow("Result", img_closed);
waitKey(0);
return 0;
}

Спасибо.


person Grant    schedule 26.06.2014    source источник
comment
Возможно, вам потребуется более нечеткий подход. Подумайте, что можно сделать с несовершенным обнаружением краев. (Это тоже, кажется, основная часть задания)   -  person Drew Dormann    schedule 26.06.2014
comment
вы можете увеличить свой порог, чтобы, по возможности, исключить объекты в фоновом режиме, а затем изучить сегментацию всего, что осталось   -  person Ben    schedule 26.06.2014
comment
Да, я могу изменить порог и получить четкие края, но проблема в том, как получить край одного листа?   -  person Grant    schedule 26.06.2014
comment
@ Дрю Дорманн. Не могли бы вы объяснить, что такое нечеткий подход? Спасибо за комментарий   -  person Grant    schedule 27.06.2014
comment
Привет, @Grant. Я предлагаю вам меньше беспокоиться о том, чтобы получить идеальный контур одного листа и посмотреть, какой анализ вы можете сделать с изображением, которое вы уже создали.   -  person Drew Dormann    schedule 27.06.2014
comment
@Grant Я обновил свой ответ, посмотрите :).   -  person Luis Enrique    schedule 06.07.2014


Ответы (1)


Ну, есть аналогичный вопрос, который задавали здесь:

Кажется, что информация о краях не является хорошим дескриптором для изображения, но если вы хотите попробовать, я сделаю следующие шаги:

  1. Загрузить изображение и преобразовать его в оттенки серого
  2. Обнаруживайте края - Canny, Sobel попробуйте их и найдите то, что вам больше всего подходит
  3. Установите порог на заданное значение, которое устраняет большую часть фона - бинаризация изображения
  4. Закройте изображение - Морфологическое закрытие, не закрывайте окно!
  5. Подсчитайте и определите объекты на изображении (капли, водораздел)
  6. Check each object for a shape (assuming you have described shapes of the leaf you could find before or a standard shape like an ellipse) features like:
  7. Если данный объект имеет заданную форму, которую вы описали как лист, значит, вы обнаружили лист !.

Я считаю, что данные изображения сделаны в реальном мире, этот алгоритм будет работать плохо, но это только начало. Надеюсь, это поможет :).

- РЕДАКТИРОВАНИЕ, ЗАПИСЬ 06/07

Что ж, поскольку у вас нет предварительной информации о листе, я думаю, что лучшее, что мы могли бы сделать, это следующее:

  • Загрузить изображение
  • Двусторонний фильтр
  • Canny
  • Извлечь контуры
  • Предположим: контур с наибольшим периметром - это лист
  • Выпуклая оболочка 3 или 2 наибольших контура (синяя линия - выпуклая оболочка)
  • Используйте эту выпуклую оболочку, чтобы вырезать граф на изображении и сегментировать его.

Если вы выполните эти шаги, вы получите такие изображения:

Сегментация листа 1

Сегментация листа 2

Я не буду публиковать здесь код, но вы можете проверить его на моем грязном гитхабе. Надеюсь, вы не против, что это было сделано на питоне.

Leaf - Github

Тем не менее, мне нужно доделать пару вещей, которые могут улучшить результат. Дорожная карта будет выглядеть так:

  • Определите маску в graphcut (как описано в документе)
  • Применение роста области может дать лучшую выпуклую оболочку
  • Удаление всех краев, которые касаются границы изображения, может помочь определить более крупные края.

Ну, опять же, надеюсь, это поможет

person Luis Enrique    schedule 26.06.2014
comment
Спасибо за Ваш ответ. Какие еще способы можно использовать для извлечения одного объекта без использования краев? - person Grant; 27.06.2014
comment
Что ж, если под извлечением вы имеете в виду идентифицировать лист и сегментировать его из изображения, некоторые из этих шагов все еще применимы. Вместо краев вы можете найти лист с помощью дескрипторов, таких как SIFT или SURF. Я считаю, что в настоящее время современные технологии представляют собой сверточные нейронные сети (глубокое обучение), но я сам еще не использовал их, поэтому я не знаю наверняка. - person Luis Enrique; 27.06.2014
comment
Не могли бы вы объяснить немного больше о морфологическом закрытии, которое я пытался сделать, но, к сожалению, используя это, я не могу завершить линии края листа. Спасибо - person Grant; 01.07.2014
comment
Взгляните на этот stackoverflow.com/questions/18339988/. Будет полезно, если вы отредактируете свой первый пост и покажете нам новые результаты в течение следующей недели. Я сам напишу код и приведу вам пример. - person Luis Enrique; 01.07.2014
comment
Большое спасибо за вашу любезную поддержку. Я обновил этот вопрос, пожалуйста, посмотрите. - person Grant; 02.07.2014
comment
Как всегда, твой ответ мне очень помогает. Спасибо, что потратили время на эту задачу. У меня все еще есть некоторые замешательства. Не могли бы вы вкратце рассказать мне, как вам удалось добиться роста региона и интерактивных изображений. - person Grant; 07.07.2014
comment
Я еще не занимался выращиванием регионов, не нашел в API Python. И в github есть исходный файл, который выполняет интерактивный захват (на самом деле источник из документации opencv) - person Luis Enrique; 08.07.2014