2

画像の赤い領域を認識するタスクがあり、最大限の精度が必要です。しかし、ソース画像の品質はかなり悪いです。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/input.jpg

しきい値の後のマスクの例: http://dl.dropbox.com/u/52502108/output.jpg

前もって感謝します。コンスタンティン B.

4

1 に答える 1

0

何らかのしきい値を適用した後、保存された画像に灰色のアーティファクトが現れる理由は... *.JPGImage<TColor, TDepth> !の標準保存形式です。より正確には、それによって適用される jpeg 圧縮。したがって、しきい値処理自体には問題はありませんでした。ただの甘やかされて育った出力画像。しかし、それは強く混乱しました。このような画像を (アーティファクトなしで) 保存する正しい方法は、たとえば次のとおりです。Image<TColor,TDepth>.Bitmap.Save(your_path, ImageFormat.Bmp)

于 2012-11-28T18:06:59.633 に答える