0

목표 : 리프 이미지의 특정 영역을 감지하고 싶습니다. 내 주변과 관련된 문제를 발견했습니다. 근접한 것은 segment object(leaf) which is on the white paper using image processing (흰색 배경에서 잎을 제거함)이지만 내 몸이 넘어서서 잎의 질병 부위를 추출/분할하는 것을 목표로합니다.리프 이미지의 관심 영역을 분할하는 방법

문제점 : 이미지에서 잎의 병이있는 영역을 정확히 구분하고 추출하는 방법.

내 시도 :
나는 비 녹지 (갈색, 회색 등) 및 I에 대한 몇 가지 inRange 값을되지 않도록 1. inRange() OpenCV의 기능 β- 임계 녹색 색상 잘하면 녹색 색상을 제거합니다;이 결과 : 그린 (분할 된 아주 정확하지 생각
이미지 1 : 나는 image1에, 이미지 2 입력과 결과의 파일

링크를 분할하기 전에 HSV에 RGB로 변환 가우시안 블러를 적용)하지만, 난 여전히) 다음 단계로 (비 녹색 영역을 추출하는 방법을

이미지 2를 모르는 : 결과 : 어두운 작은 원이 포함 된 가정 나는 (도 및 C++) OpenCV의 새로운 오전하지

한다/고려 녹색과 나는 퍼지-C와 K-수단 클러스터링 방법 (같은 몇 가지 기술을 읽고, 등)에 대한 세분화하지만 내 이미지에 사용할 세분화 기법을 결정할 수 없습니다. 또한 모든 이미지에 적용 할 수있는 보편적 인 세분화 기법과 같은 것이 없다는 것을 읽은 기사에서 배웠습니다.

따라서 이미지를 정확히 분류하기 위해 내가 가지고있는 이미지의 종류를 적용하는 것이 가장 좋은 기법 (클러스터링 방법? 영역 기반 히스토그램? 등) 또는 프로세스를 알고 싶습니다.

대단히 감사합니다.

답변

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

추출 녹색 지역을 할 것입니다 : -가 여기 HSV 색 공간, inrange 등을 사용한다 .. 귀하의 질문에 언급 된 바와 같이.위의 이미지에 대한

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

이 병에 걸린 영역 그리기 : - 당신이 윤곽 등 그릴 윤곽을 발견 할 필요가 다시 여기에을 ...

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

이 대답을 사용하여 여기 [link] (http://stackoverflow.com/questions/10176184/with-opencv-try-to-extract-a-region-of-a-picture-described-by-arrayofarrays#), 나는 윤곽선 내에서 영역을 얻으려고했는데 (단지 로이가 보이고 나머지는 검은 색), 이미지의 첫 번째 윤곽선 내에서만 영역을 얻을 수 있었지만 모든 윤곽선을 얻을 수는 없었습니다. 모든 윤곽의 내용을 얻는 방법에 대한 조언을 해 줄 수 있습니까? 대단히 감사드립니다. :) – user3339658

+0

등고선을 마스크로 [Mat :: copyTo()] (http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-copyto)를 사용하기 만하면됩니다. – Haris

관련 문제