在图像上存在识别红色区域的任务,并且它需要最大精度。但是源图像的质量非常糟糕。我正在尝试使用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.
答案 0 :(得分:0)
在应用任何类型的阈值后,在保存的图像上出现灰色瑕疵的原因是...... *。JPG Image<TColor, TDepth>
的标准保存格式!更确切地说,它应用了jpeg压缩。阈值处理没有问题。只是一个被破坏的输出图像。虽然这很令人困惑。保存此类图像(没有工件)的正确方法是,例如:Image<TColor,TDepth>.Bitmap.Save(your_path, ImageFormat.Bmp)