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

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

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

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

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

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

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

редактировать

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

  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;
}

Спасибо.

3

Решение

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

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

  1. Загрузите изображение и преобразуйте его в оттенки серого
  2. Обнаружение краев — Canny, Sobel попробуй их и найди то, что тебе больше подходит
  3. Установить пороговое значение для данного значения, которое устраняет большую часть фона — изображение Binarize
  4. Закройте изображение — Морфологический конец не закрывает окно!
  5. Подсчитайте и определите объекты на изображении (Blobs, Watershed)
  6. Проверьте каждый объект на предмет формы (если вы описали формы листа, которые вы могли найти раньше, или стандартную форму, например, эллипс), такие как:
  7. Если данный объект имеет заданную форму, которую вы описали как лист, то вы обнаружили лист !.

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

— ПОСТ РЕДАКТИРОВАТЬ 06/07

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

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

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

Лист 1 сегментация

Лист 2 сегментация

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

Лист — Github

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

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

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

6

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector