0

Цель: Я хочу определить определенные области листовых изображений. Я нашел связанные с этим проблемы, близкие к этому segment object(leaf) which is on the white paper using image processing (удаляя лист с белого фона), но мой выходит за его пределы, он направлен на извлечение/сегмент больной области листа.Как отделить интересующую область от площади изображения

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

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

Ссылки на файлы из image1, входа IMAGE2 и результатов:
image1: Результат: Грина был сегментирован (мысль не совсем точно), но я до сих пор не знаю, как извлечь без зеленых зон (в качестве следующего шага)

iMAGE2: Результат: темные маленькие круги были включены/считается зеленый, который якобы не

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

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

спасибо.

ответ

4

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

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

enter image description hereenter image description here

enter image description hereenter image description here

Приведенные ниже фрагменты кода будут делать выше

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

экстракт зеленого область: - Здесь вы должны использовать ВПГ цветовое пространство, попадани в диапазон и т.д .. как указано в вашем вопросе.

enter image description hereenter image description here

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

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

enter image description hereenter image description here

bitwise_not(hsv_thr, dst, mask); 

Draw пораженную область: - Здесь снова вам нужно сделать, найти контур нарисовать контур и т.д ...

enter image description hereenter image description here

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 и т. д. Также в приведенном выше алгоритме учитывается, что ваш фон всегда белый, а для другого фона вам нужно изменить шаги для создания изображения маски.

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

+0

Это то, что мне действительно нужно. Это очень полезно. Я просто хочу спросить, есть ли другие форматы для интересующей области (не зеленые)? Я хотел получить серию или цветное изображение версии roi (не двоичного) для дальнейшей обработки. – user3339658

+0

, используя этот ответ здесь [ссылка] (http://stackoverflow.com/questions/10176184/with-opencv-try-to-extract-a-region-of-a-picture-described-by-arrayofarrays#), I попытался получить область внутри контура (где видна только руа, другие - черные), но я смог получить область только в первом контуре изображения, а не во всех контурах. Можете ли вы дать мне несколько указателей на то, как я могу получить содержимое всех контуров? заранее большое спасибо. :) – user3339658

+0

Просто используйте [Mat :: copyTo()] (http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-copyto) с контурами в качестве маски. – Haris