下面是我用c#写的平均值滤波法方法: public unsafe void ArithmeticFilterAverage(System.Drawing.Imaging.BitmapData bd)
{
byte r, g, b;
for (int i = 0; i < bd.Height; i++)
{
for (int j = 0; j < bd.Width; j++)
{
if (i == 0 || j == 0 || i == bd.Height - 1 || j == bd.Width - 1)
{
continue;
}
else
{
byte* p1 = _P - 3*bd.Width - 3;
byte* p2 = _P - 3 * bd.Width;
byte* p3 = _P - 3 * bd.Width + 3;
byte* p4 = _P - 3;
byte* p5 = _P + 3;
byte* p6 = _P + 3 * bd.Width - 3;
byte* p7 = _P + 3 * bd.Width;
byte* p8 = _P + 3 * bd.Width + 3;
r = (byte)((p1[0] + p2[0] + p3[0] + p4[0] + p5[0] + p6[0] + p7[0] + p8[0] + _P[0]) / 9);
g = (byte)((p1[1] + p2[1] + p3[1] + p4[1] + p5[1] + p6[1] + p7[1] + p8[1] + _P[1]) / 9);
b = (byte)((p1[2] + p2[2] + p3[2] + p4[2] + p5[2] + p6[2] + p7[2] + p8[2] + _P[2]) / 9);
_P[0] = r;
_P[1] = g;
_P[2] = b;
}
_P = _P + 3;
}
}
}
在执行 r = (byte)((p1[0] + p2[0] + p3[0] + p4[0] + p5[0] + p6[0] + p7[0] + p8[0] + _P[0]) / 9); 这一行时出现如下错误: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
{
byte r, g, b;
for (int i = 0; i < bd.Height; i++)
{
for (int j = 0; j < bd.Width; j++)
{
if (i == 0 || j == 0 || i == bd.Height - 1 || j == bd.Width - 1)
{
continue;
}
else
{
byte* p1 = _P - 3*bd.Width - 3;
byte* p2 = _P - 3 * bd.Width;
byte* p3 = _P - 3 * bd.Width + 3;
byte* p4 = _P - 3;
byte* p5 = _P + 3;
byte* p6 = _P + 3 * bd.Width - 3;
byte* p7 = _P + 3 * bd.Width;
byte* p8 = _P + 3 * bd.Width + 3;
r = (byte)((p1[0] + p2[0] + p3[0] + p4[0] + p5[0] + p6[0] + p7[0] + p8[0] + _P[0]) / 9);
g = (byte)((p1[1] + p2[1] + p3[1] + p4[1] + p5[1] + p6[1] + p7[1] + p8[1] + _P[1]) / 9);
b = (byte)((p1[2] + p2[2] + p3[2] + p4[2] + p5[2] + p6[2] + p7[2] + p8[2] + _P[2]) / 9);
_P[0] = r;
_P[1] = g;
_P[2] = b;
}
_P = _P + 3;
}
}
}
在执行 r = (byte)((p1[0] + p2[0] + p3[0] + p4[0] + p5[0] + p6[0] + p7[0] + p8[0] + _P[0]) / 9); 这一行时出现如下错误: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
然后是你的范围不对,i应该从1开始,到bd.Height - 1
j同样