#c #opencv #image-processing #contour #edge-detection
#c #opencv #обработка изображений #контур #обнаружение границ
Вопрос:
Я хочу определить и извлечь контур самого большого листа следующего изображения, используя OpenCV и C .
Я применил к изображению детектор краев Canny и получил следующий результат.
Canny(img_src, img_edge_detected, 20, 60, 3);
Теперь я хочу извлечь самый большой контур (самый большой лист) из изображения и нарисовать контурную линию, но проблема здесь в том, что линия края самого большого листа не является непрерывной. Итак, я заглянул в dialate и morphological close, но, используя эти функции, я не смог получить хороший результат для извлечения области. Есть ли какой-либо способ получить самый большой контур на таком изображении?
Обратите внимание, что здесь я не могу использовать сопоставление шаблонов или какие-либо маскирующие вещи, потому что мое окончательное намерение — создать систему, в которой пользователь может загружать изображение и получать виды растения. Таким образом, система не имеет никакого предварительного представления о форме листа, который пользователь собирается загрузить.
Пожалуйста, скажите мне, как найти и нарисовать здесь самый большой контур, если это возможно.
Спасибо.
Комментарии:
1. вы пытались сначала сгруппировать по цвету? По крайней мере, для этого примера это может сработать. Работа только с контуром здесь кажется мне совершенно невозможной, поскольку они не разделены.
2. Спасибо за ответ. Я не пытался использовать кластеризацию, я просто пытался использовать обнаружение границ, не могли бы вы указать мне на хороший пример кластеризации, я новичок в обработке изображений.
3. Как говорит @Micka, это действительно проблема сегментации, вы слишком быстро переходите к контурам. Вы могли бы начать с предположения, что интересующий лист является центральным на изображении, и, возможно, использовать watershed или floodfill для его сегментации.
4. Не могли бы вы немного объяснить, как выполнить сегментацию или кластеризацию здесь?
5. @RogerRowland ссылка была разорвана. Возможно, сегментация изображения с помощью алгоритма водораздела полезна.
Ответ №1:
не можете ли вы использовать hsv color threshoding для отслеживания только этого листа, а затем вы можете сразу использовать функцию minmaxloc, чтобы получить область самого большого контура. просто идея, попробуйте сделать это так that.it будет работать.удачи
Ответ №2:
То же самое, что я сделаю в Java, пожалуйста, преобразуйте его в c , здесь BGR для преобразования HSV, затем после примените комбинацию желтого, зеленого и коричневого с указанным диапазоном и просто выполните побитовую операцию или. это даст вам не нулевые пиксели, используя ядро функции opencv.findNonZero (Mat src, Mat dst);
Imgproc.cvtColor(mRgba, mHSV, Imgproc.COLOR_BGR2HSV, 4); //Желтый Core.inRange(mHSV, новый скаляр (25, 80, 80), новый скаляр (36, 255, 255), желтый); //Зеленый Core.inRange(mHSV, новый скаляр (37, 80, 80), новый скаляр (70, 255, 255), зеленый); //Коричневый Core.inRange(mHSV, новый скаляр (10, 80, 80), новый скаляр (30, 200, 200), коричневый); // логический Или маскирующий Core.bitwise_or(желтый, зеленый, green); Core.bitwise_or(зеленый, коричневый, маска); Imgproc.dilate(маска, mask, новый Mat()); // Найти ненулевые пиксели pts = Mat.zeros(mask.size(), mask.type()); Core.findNonZero (маска, pts); возвращает маску;