Как сегментировать область интереса в изображении листа

Задача:
Я хочу обнаружить определенные области изображений листьев.
Я нашел связанные проблемы, близкие к которым это сегментный объект (лист), который находится на белой бумаге с использованием обработки изображения (удаляя лист с белого фона), но мой выходит за его пределы, он стремится извлечь / сегментировать больную область листа.

Проблема:
Как правильно сегментировать и извлечь пораженные участки листа на изображении.

Моя попытка:
1. inRange () функция OpenCV
-Установите пороговое значение зеленого цвета, чтобы я не использовал несколько значений inRange для не зеленых областей (коричневый, серый и т. Д.), И я надеюсь удалить зеленый цвет; Я применил размытие по Гауссу, преобразованное из RGB в HSV перед сегментированием

Ссылка на файлы из image1, image2 ввода и результатов:
Изображение1:
Результат: Зеленый был сегментирован (думал не совсем точно), но я все еще не знаю, как извлечь не зеленые области (как следующий шаг)

Image2:
Результат: Темные маленькие кружочки были включены / считаются зелеными, которые предположительно не должны

Я новичок в OpenCV (а также в C ++) и прочитал несколько методов (таких как методы кластеризации fuzzy-c и k-means и т. Д.) Для сегментации, но я не могу решить, какую технику сегментации использовать для моих изображений. Из статей, которые я прочитал, я также узнал, что нет такой вещи, как универсальная техника сегментации, которая может применяться ко всем изображениям.

Таким образом, я хотел бы знать, какой метод (метод кластеризации, «основанный на области», «гистограмма» и т. Д.) Или процесс лучше всего применять для видов изображений, которые у меня есть, для точной сегментации указанных изображений.

Большое спасибо.

0

Решение

Просто попробуйте ниже шагов

Создать изображение маски: — Сначала вам нужно создать изображение маски для листа, вам нужно выполнить настройку порога, найти контур (наибольший), нарисовать контур (с заполненным) и т. Д. … также для удаления краевого эффекта вам нужно стереть маску, которая даст лучше результат.

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

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

Приведенные ниже фрагменты кода сделают выше

Mat thr;
Mat src=imread("image2.png",1); //Your processed  image
cvtColor(src,thr,CV_BGR2GRAY);
threshold(thr,thr,180,255,THRESH_BINARY_INV);

vector< vector <Point> > contours; // Vector for storing contour
vector< Vec4i > hierarchy;
int largest_contour_index=0;
int largest_area=0;
Mat mask(src.rows,src.cols,CV_8UC1,Scalar::all(0)); //create destination image
findContours( thr.clone(), contours, hierarchy,CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE ); // Find the contours in the image
for( int i = 0; i< contours.size(); i++ ) // iterate through each contour.
{
double a=contourArea( contours[i],false);  //  Find the area of contour
if(a>largest_area){
largest_area=a;
largest_contour_index=i;                //Store the index of largest contour
}
}
drawContours( mask,contours, largest_contour_index, Scalar(255,255,255),CV_FILLED, 8, hierarchy ); // Draw the largest contour using previously stored index.
int dilation_size = 2;
Mat element = getStructuringElement( MORPH_RECT,
Size( 2*dilation_size + 1, 2*dilation_size+1 ),
Point( dilation_size, dilation_size ) );
erode( mask, mask, element );

Извлечь зеленую область: — Здесь вы должны использовать цветовое пространство hsv, inrange и т. Д., Как указано в вашем вопросе.

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

Mat HSV,hsv_thr,dst;
cvtColor(src,HSV,CV_BGR2HSV);
inRange(HSV,Scalar(20,10,10),Scalar(90,255,255),hsv_thr);

bitwise_not для изображения выше: — Здесь вы должны использовать маску, созданную выше.

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

  bitwise_not(hsv_thr, dst, mask);

Нарисуйте больную область: — Здесь снова нужно найти контур, нарисовать контур и т. Д.

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

findContours( dst.clone(), contours, hierarchy,CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE ); // Find the contours in the image
for( int i = 0; i< contours.size(); i++ ) // iterate through each contour.
drawContours( src,contours, i, Scalar(0,0,255),1, 8, hierarchy );

Вы можете улучшить результат, применив надлежащую фильтрацию, установив пороговое значение, используя правильный диапазон hsv и т. Д. Также в приведенном выше алгоритме учитывается, что ваш фон всегда белый, а для другого фона необходимо изменить шаги для создания маскирующего изображения.

Надеюсь, что это полезно …

4

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

Других решений пока нет …

По вопросам рекламы [email protected]