读书人

C#中值滤波算法的有关问题

发布时间: 2013-06-19 10:26:41 作者: rapoo

C#中值滤波算法的问题
这两天想整一下验证码图片的识别,了解到中值滤波算法对消除噪点特别有用,于是学习了一下中值滤波的算法,搞出来个中值滤波的方法,但是实际效果很不理想,不知道是代码的问题还是什么其他问题,期待高手指教!
代码如下:


public Bitmap Medianfilter(Bitmap bitmap,Int32 Radius)
{
Bitmap tarBitmap = new Bitmap(bitmap.Width, bitmap.Height);
for (Int32 x = 0; x < bitmap.Width; x++)
for (Int32 y = 0; y < bitmap.Height; y++)
{
Int32 left = x - Radius > 0 ? x - Radius : 0;
Int32 top = y - Radius > 0 ? y - Radius : 0;
Int32 right = x + Radius > bitmap.Width ? bitmap.Width : x + Radius;
Int32 bottom = y + Radius > bitmap.Height ? bitmap.Height : y + Radius;
List<Int32> listColor = new List<int>();

for(Int32 i = left; i < right; i ++)
for (Int32 j = top; j < bottom; j++)
{
if (!listColor.Contains(bitmap.GetPixel(i, j).R)) listColor.Add(bitmap.GetPixel(i, j).R);
}

listColor.Sort();
Int32 intMedian;
if (listColor.Count == 0) continue;
if (listColor.Count % 2 == 0)
intMedian = (listColor[listColor.Count / 2] + listColor[listColor.Count / 2 - 1]) / 2;
else
intMedian = listColor[(listColor.Count - 1) / 2];
tarBitmap.SetPixel(x, y, Color.FromArgb(intMedian, intMedian, intMedian));
}
return tarBitmap;
}

我不知道怎么贴图片,验证码图片可以用注册163邮箱时的图片,是汉字。


[解决办法]
代码问题,你使用tarBitmap.SetPixel后就改变了tarBitmap某个位置的像素值,然后你在下一个循环中GetPixel时获取这个位置的值就是这个改变后的值,这和算法愿意冲突。

[解决办法]
既然算法本身是对的,那就表明用这个算法对付不了你要对付的目标。

加噪永远比除噪容易,既然有除噪算法,别人针对着进行更强的加噪也就很正常了。

话说,现在有些验证码图片人都难看懂,别说傻乎乎的CPU了。

读书人网 >C#

热点推荐