unsafe
{
byte* p = (byte*)scan0;
byte* pSrc = (byte*)srcScan0;
int nWidth = grayscaleImageNew.Width - 2;
int nHeight = grayscaleImageNew.Height - 2;
int nOffset1 = stride - grayscaleImageNew.Width * 3;
int nPixel;
List array1 = new List();
for (int y = 0; y < nHeight; y++)
{
for (int x = 0; x < nWidth; x++)
{
/清空数组/
array1.Clear();
array1.Add(pSrc[0]);
array1.Add(pSrc[5]);
array1.Add(pSrc[10]);
array1.Add(pSrc[15]);
array1.Add(pSrc[20]);
array1.Add(pSrc[0 + stride]);
array1.Add(pSrc[5 + stride]);
array1.Add(pSrc[10 + stride]);
array1.Add(pSrc[15 + stride]);
array1.Add(pSrc[20 + stride]);
array1.Add(pSrc[0 + stride2]);
array1.Add(pSrc[5 + stride2]);
array1.Add(pSrc[10 + stride2]);
array1.Add(pSrc[15 + stride2]);
array1.Add(pSrc[20 + stride2]);
array1.Add(pSrc[0 + stride3]);
array1.Add(pSrc[5 + stride3]);
array1.Add(pSrc[10 + stride3]);
array1.Add(pSrc[15 + stride3]);
array1.Add(pSrc[20 + stride3]);
array1.Add(pSrc[0 + stride4]);
array1.Add(pSrc[5 + stride4]);
array1.Add(pSrc[10 + stride4]);
array1.Add(pSrc[15 + stride4]);
array1.Add(pSrc[20 + stride4]);
/*对数据进行大小排序*/
array1.Sort();
nPixel = array1[array1.Count / 2];
if (nPixel < 0) nPixel = 0;
if (nPixel > 255) nPixel = 255;
/*对像素进行赋值*/
pSrc[10 + stride2] = (byte)nPixel;
array1.Clear();
array1.Add(pSrc[1]);
array1.Add(pSrc[6]);
array1.Add(pSrc[11]);
array1.Add(pSrc[16]);
array1.Add(pSrc[21]);
array1.Add(pSrc[1 + stride]);
array1.Add(pSrc[6 + stride]);
array1.Add(pSrc[11 + stride]);
array1.Add(pSrc[16 + stride]);
array1.Add(pSrc[21 + stride]);
array1.Add(pSrc[1 + stride2]);
array1.Add(pSrc[6 + stride2]);
array1.Add(pSrc[11 + stride2]);
array1.Add(pSrc[16 + stride2]);
array1.Add(pSrc[21 + stride2]);
array1.Add(pSrc[1 + stride3]);
array1.Add(pSrc[6 + stride3]);
array1.Add(pSrc[11 + stride3]);
array1.Add(pSrc[16 + stride3]);
array1.Add(pSrc[21 + stride3]);
array1.Add(pSrc[1 + stride4]);
array1.Add(pSrc[6 + stride4]);
array1.Add(pSrc[11 + stride4]);
array1.Add(pSrc[16 + stride4]);
array1.Add(pSrc[21 + stride4]);
/*对数据进行大小排序*/
array1.Sort();
nPixel = array1[array1.Count / 2];
if (nPixel < 0) nPixel = 0;
if (nPixel > 255) nPixel = 255;
/*对像素进行赋值*/
pSrc[11 + stride2] = (byte)nPixel;
array1.Clear();
array1.Add(pSrc[2]);
array1.Add(pSrc[7]);
array1.Add(pSrc[12]);
array1.Add(pSrc[17]);
array1.Add(pSrc[22]);
array1.Add(pSrc[2 + stride]);
array1.Add(pSrc[7 + stride]);
array1.Add(pSrc[12 + stride]);
array1.Add(pSrc[17 + stride]);
array1.Add(pSrc[22 + stride]);
array1.Add(pSrc[2 + stride2]);
array1.Add(pSrc[7 + stride2]);
array1.Add(pSrc[12 + stride2]);
array1.Add(pSrc[17 + stride2]);
array1.Add(pSrc[22 + stride2]);
array1.Add(pSrc[2 + stride3]);
array1.Add(pSrc[7 + stride3]);
array1.Add(pSrc[12 + stride3]);
array1.Add(pSrc[17 + stride3]);
array1.Add(pSrc[22 + stride3]);
array1.Add(pSrc[2 + stride4]);
array1.Add(pSrc[7 + stride4]);
array1.Add(pSrc[12 + stride4]);
array1.Add(pSrc[17 + stride4]);
array1.Add(pSrc[22 + stride4]);
/*对数据进行大小排序*/
array1.Sort();
nPixel = array1[array1.Count / 2];
if (nPixel < 0) nPixel = 0;
if (nPixel > 255) nPixel = 255;
/*对像素进行赋值*/
pSrc[12 + stride2] = (byte)nPixel;
array1.Clear();
array1.Add(pSrc[3]);
array1.Add(pSrc[8]);
array1.Add(pSrc[13]);
array1.Add(pSrc[18]);
array1.Add(pSrc[23]);
array1.Add(pSrc[3 + stride]);
array1.Add(pSrc[8 + stride]);
array1.Add(pSrc[13 + stride]);
array1.Add(pSrc[18 + stride]);
array1.Add(pSrc[23 + stride]);
array1.Add(pSrc[9 + stride2]);
array1.Add(pSrc[8 + stride2]);
array1.Add(pSrc[13 + stride2]);
array1.Add(pSrc[18 + stride2]);
array1.Add(pSrc[23 + stride2]);
array1.Add(pSrc[9 + stride3]);
array1.Add(pSrc[8 + stride3]);
array1.Add(pSrc[13 + stride3]);
array1.Add(pSrc[18 + stride3]);
array1.Add(pSrc[23 + stride3]);
array1.Add(pSrc[9 + stride4]);
array1.Add(pSrc[8 + stride4]);
array1.Add(pSrc[13 + stride4]);
array1.Add(pSrc[18 + stride4]);
array1.Add(pSrc[23 + stride4]);
/*对数据进行大小排序*/
array1.Sort();
nPixel = array1[array1.Count / 2];
if (nPixel < 0) nPixel = 0;
if (nPixel > 255) nPixel = 255;
/*对像素进行赋值*/
pSrc[13 + stride2] = (byte)nPixel;
array1.Clear();
array1.Add(pSrc[4]);
array1.Add(pSrc[9]);
array1.Add(pSrc[14]);
array1.Add(pSrc[19]);
array1.Add(pSrc[24]);
array1.Add(pSrc[4 + stride]);
array1.Add(pSrc[9 + stride]);
array1.Add(pSrc[14 + stride]);
array1.Add(pSrc[19 + stride]);
array1.Add(pSrc[24 + stride]);
array1.Add(pSrc[4 + stride2]);
array1.Add(pSrc[9 + stride2]);
array1.Add(pSrc[14 + stride2]);
array1.Add(pSrc[19 + stride2]);
array1.Add(pSrc[24 + stride2]);
array1.Add(pSrc[4 + stride3]);
array1.Add(pSrc[9 + stride3]);
array1.Add(pSrc[14 + stride3]);
array1.Add(pSrc[19 + stride3]);
array1.Add(pSrc[24 + stride3]);
array1.Add(pSrc[4 + stride4]);
array1.Add(pSrc[9 + stride4]);
array1.Add(pSrc[14 + stride4]);
array1.Add(pSrc[19 + stride4]);
array1.Add(pSrc[24 + stride4]);
/*对数据进行大小排序*/
array1.Sort();
nPixel = array1[array1.Count / 2];
if (nPixel < 0) nPixel = 0;
if (nPixel > 255) nPixel = 255;
/*对像素进行赋值*/
pSrc[14 + stride2] = (byte)nPixel;
p = p + 5;
pSrc = pSrc + 5;
}
p = p + nOffset1;
}
}
grayscaleImageNew.UnlockBits(bmData);
srcBmp.UnlockBits(bmSrcData);
grayscaleImageNew = srcBmp;
pictureBox2.Image = srcBmp.Clone() as Image;
break;
你这代码我没看,回答你上一个问题
http://accord-framework.net/docs/html/T_Accord_Imaging_Filters_Median.htm
这个是accord的中值滤镜(滤波,我说滤镜主要是兼容ps的中文翻译,ps的滤镜组其实就是这些东西)
你的自定义window就是这个类构造里面的那个 size(当然按照算法要求,他的是奇数)
源代码:https://github.com/accord-net/framework/blob/master/Sources/Accord.Imaging/AForge.Imaging/Filters/Smooting/Median.cs
当然这个我也没仔细看,只看了看size的定义要求[3,25],默认3,最大到25
滤波需要有一个滑动的窗口,但是在你的代码中并没有看到,你可以参考一下这篇文章https://blog.csdn.net/lixiao0314/article/details/120948652