OpenCV удаляет контуры меньшего размера

#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);

 возвращает маску;