Задача:
Я хочу обнаружить определенные области изображений листьев.
Я нашел связанные проблемы, близкие к которым это сегментный объект (лист), который находится на белой бумаге с использованием обработки изображения (удаляя лист с белого фона), но мой выходит за его пределы, он стремится извлечь / сегментировать больную область листа.
Проблема:
Как правильно сегментировать и извлечь пораженные участки листа на изображении.
Моя попытка:
1. inRange () функция OpenCV
-Установите пороговое значение зеленого цвета, чтобы я не использовал несколько значений inRange для не зеленых областей (коричневый, серый и т. Д.), И я надеюсь удалить зеленый цвет; Я применил размытие по Гауссу, преобразованное из RGB в HSV перед сегментированием
Ссылка на файлы из image1, image2 ввода и результатов:
Изображение1:
Результат: Зеленый был сегментирован (думал не совсем точно), но я все еще не знаю, как извлечь не зеленые области (как следующий шаг)
Image2:
Результат: Темные маленькие кружочки были включены / считаются зелеными, которые предположительно не должны
Я новичок в OpenCV (а также в C ++) и прочитал несколько методов (таких как методы кластеризации fuzzy-c и k-means и т. Д.) Для сегментации, но я не могу решить, какую технику сегментации использовать для моих изображений. Из статей, которые я прочитал, я также узнал, что нет такой вещи, как универсальная техника сегментации, которая может применяться ко всем изображениям.
Таким образом, я хотел бы знать, какой метод (метод кластеризации, «основанный на области», «гистограмма» и т. Д.) Или процесс лучше всего применять для видов изображений, которые у меня есть, для точной сегментации указанных изображений.
Большое спасибо.
Просто попробуйте ниже шагов
Создать изображение маски: — Сначала вам нужно создать изображение маски для листа, вам нужно выполнить настройку порога, найти контур (наибольший), нарисовать контур (с заполненным) и т. Д. … также для удаления краевого эффекта вам нужно стереть маску, которая даст лучше результат.
Приведенные ниже фрагменты кода сделают выше
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 и т. Д. Также в приведенном выше алгоритме учитывается, что ваш фон всегда белый, а для другого фона необходимо изменить шаги для создания маскирующего изображения.
Надеюсь, что это полезно …
Других решений пока нет …