Для моего студенческого проекта мне нужно определить вид растения по форме листа растения, определяя края листа. (Я использую OpenCV 2.4.9 и C ++), но исходное изображение было снято в реальной среде растения и имеет более одного листа. См. Изображение ниже. Итак, здесь мне нужно извлечь краевой узор только одного листа для дальнейшей обработки.
Используя Canny Edge Detector, я могу идентифицировать края всего изображения.
Но я не знаю, как дальше извлекать краевой узор всего одного листа, может быть более четкий и полный лист. Я не знаю, возможно ли это тоже. Может ли кто-нибудь сказать мне, возможно ли это, как извлечь края одного листа, я просто хочу знать шаги обработки изображения, которые мне нужно применить к изображению. Мне не нужны образцы кода. Я новичок в обработке изображений и OpenCV и учусь на экспериментах.
Заранее спасибо.
Изменить
Как сказал Луис, я сделал морфологию близко к изображению после обнаружения краев с помощью Canny edge detection, но, похоже, мне все еще трудно найти самый большой контур на изображении. Вот шаги, которые я предпринял для обработки изображения
Примените двусторонний фильтр, чтобы уменьшить шум
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;
}
Спасибо.