There is a task of recognition red areas on an image and it requires maximum of accuracy. But the quality of a source image is quite bad. I’m trying to minimize a noise on a mask with detected red areas using cvThreshold. Unfortunately, there is no expected effect – gray artifacts stay.
//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");
In the same time here it works fine – saved image is purely white:
#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
Mask before threshold example:
http://dl.dropbox.com/u/52502108/input.jpg
Mask after threshold example:
http://dl.dropbox.com/u/52502108/output.jpg
Thank You in advance.
Constantine B.
The reason of an appearing of that gray artifacts on saved images after applying of any kind of a threshold is… *.JPG standard saving format of
Image<TColor, TDepth>! More precisely, a jpeg compression applied by it. So there was no problem with thresholding itself. Just a spoiled output image. It was confusing strongly though. The right way of saving such images (without artifacts) is, for example:Image<TColor,TDepth>.Bitmap.Save(your_path, ImageFormat.Bmp)