2012-08-07 2 views
2

이미지에 빨간색 영역을 인식하는 작업이 있으며 최대 정확도가 필요합니다. 그러나 원본 이미지의 품질은 상당히 나쁩니다. cvThreshold를 사용하여 감지 된 빨간색 영역이있는 마스크의 노이즈를 최소화하려고합니다. 불행히도 예상되는 효과는 없습니다. 회색 유물이 유지됩니다. 여기에 같은 시간에 C# EmguCV/OpenCV "cvThreshold"비정상적인 동작 - 임계 값 결과가 없습니다.

//Converting from Bgr to Hsv 
Image<Hsv, Byte> hsvimg = markedOrigRecImg.Convert<Hsv, Byte>(); 
Image<Gray, Byte>[] channels = hsvimg.Split(); 

Image<Gray, Byte> hue = channels[0]; 
Image<Gray, Byte> saturation = channels[1]; 
Image<Gray, Byte> value = channels[2]; 

Image<Gray, Byte> hueFilter = hue.InRange(new Gray(0), new Gray(30)); 
Image<Gray, Byte> satFilter = saturation.InRange(new Gray(100), new Gray(255)); 
Image<Gray, Byte> valFilter = value.InRange(new Gray(50), new Gray(255)); 

//Mask contains gray artifacts   
Image<Gray,Byte> mask = (hueFilter.And(satFilter)).And(valFilter); 

//Gray artifacts stays even if threshold (the third param.) value is 0... 
CvInvoke.cvThreshold(mask, mask, 100, 255, THRESH.CV_THRESH_BINARY); 

mask.Save("D:/img.jpg"); 

는 그것을 잘 작동합니다 - 저장된 이미지는 순수한 백색 :

#region test 

Image<Gray,Byte> some = new Image<Gray, byte>(mask.Size); 
some.SetValue(120); 
CvInvoke.cvThreshold(some, some, 100, 255, THRESH.CV_THRESH_BINARY); 
some.Save("D:/some.jpg"); 

#endregion 

마스크 임계 예를 들어 이전 : http://dl.dropbox.com/u/52502108/output.jpg

: http://dl.dropbox.com/u/52502108/input.jpg

마스크 임계 값 예 후

미리 감사드립니다. 콘스탄틴 B.

+0

어딘가에 이미지를 게시 할 수 있습니까? – sinelaw

+0

업로드 됨. 위의 링크를 참조하십시오. – user1582682

+0

이미지가 동일하고 아무것도 빨간색입니다. 입력 이미지로 수행 할 작업을 더 잘 설명 할 수 있습니까? – sinelaw

답변

0

임계 값의 어떤 종류의 적용 후 저장된 이미지에 그 회색 유물의 등장의 이유는 ... Image<TColor, TDepth>* .JPG 표준 저장 형식! 보다 정확하게는 jpeg 압축이 적용됩니다. 그래서 thresholding 자체에는 문제가 없었습니다. 그냥 버릇없는 출력 이미지. 그러나 그것은 매우 혼란 스러웠습니다. 이러한 이미지 (유물이없는)를 저장하는 올바른 방법은 다음과 같습니다. Image<TColor,TDepth>.Bitmap.Save(your_path, ImageFormat.Bmp)