Для моего проекта в колледже мне нужно идентифицировать вид растения по форме листа растения, определяя края листа. (Я использую OpenCV 2.4.9 и C ++), но исходное изображение получено в реальной среде растения и имеет более одного листа. Смотрите пример изображения ниже. Поэтому здесь мне нужно извлечь шаблон края только одного листа для дальнейшей обработки.
Используя Canny Edge Detector, я могу определить края всего изображения.
Но я не знаю, как поступить отсюда, чтобы извлечь шаблон края только из одного листа, может быть, более ясный и полный лист. Я не знаю, возможно ли это тоже. Может кто-нибудь, пожалуйста, скажите мне, если это возможно, как извлечь края одного листа, я просто хочу знать шаги обработки изображения, которые мне нужно применить к изображению. Я не хочу никаких примеров кода. Я новичок в обработке изображений и OpenCV, а также в обучении, проводя эксперименты.
Заранее спасибо.
редактировать
Как сказал Луис, я сделал морфологию близко к изображению после обнаружения края с помощью обнаружения края Кэнни, но мне все еще трудно найти самый большой контур на изображении.
Вот шаги, которые я предпринял для обработки изображения
Применить Двусторонний фильтр, чтобы уменьшить шум
bilateralFilter(img_src, img_blur, 31, 31 * 2, 31 / 2);
Отрегулируйте контрастность выравниванием гистограммы
cvtColor(img_blur,img_equalized,CV_BGR2GRAY);
Применить детектор края Canny
Canny(img_equalized, img_edge_detected, 20, 60, 3);
Порог двоичного изображения для удаления некоторых фоновых данных
threshold(img_edge_detected, img_threshold, 1, 255,THRESH_BINARY_INV);
Морфологический конец изображения
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;
}
Спасибо.
Ну, есть похожий вопрос, который был задан здесь:
Кажется, что информация о краях не является хорошим дескриптором изображения, но если вы захотите попробовать, я сделаю следующие шаги:
Я считаю, что данные изображения взяты в реальном мире, этот алгоритм будет работать плохо, но это только начало. Надеюсь, это поможет :).
— ПОСТ РЕДАКТИРОВАТЬ 06/07
Ну, поскольку у вас нет предварительной информации о листе, я думаю, что лучшее, что мы могли бы сделать, это следующее:
Если вы выполните эти шаги, вы получите такие изображения:
Я не буду размещать код здесь, но вы можете проверить его в моем грязном github. Надеюсь, вы не против, что это было сделано в python.
Тем не менее, у меня есть пара вещей, которые можно закончить, которые могли бы улучшить результат.
Ну опять надеюсь надеюсь поможет