图像处理(八)图像滤波
来源:互联网 发布:不认盘数据恢复 编辑:程序博客网 时间:2024/05/16 14:02
均值滤波属于线性滤波方法,中值滤波属于非线性方法。他们都属于空间域内平滑方法。对于给定的图像f(x, y)中的每个像素点(x, y),取其邻域Sxy,设Sxy含有M个像素,取其平均值做为处理后所得图像像素点(x, y)处的灰度值,该方法称为均值滤波,而取其中值做为处理后所得图像像素带点(x, y)处的灰度,称为中值滤波。
均值滤波方法能有效地抑制噪声,但同时也由于平均而引起了模糊现象,模糊程度与邻域半径成正比,中值滤波方法主要功能是让周围像素灰度值差别比较大的像素改为选取与周围的像素值接近的值,从而可以消除孤立的噪声点,所以中值滤波对于滤除图像昂的椒盐噪声非常有效,中值滤波可以做到既去除噪声又能保护图像的边缘,从而获得较满意的复原效果。
下面是算法的具体实现,采用的滤波窗口大小为3*3和5*5(附,获取图像颜色类型方法:灰度、二值、24位彩色)
/// <summary> /// 图像格式类型 /// </summary> public enum ImageFormats { /// <summary> /// 二值图 /// </summary> BinaryzationFormat = 1, /// <summary> /// 灰度图 /// </summary> GrayFormat = 2, /// <summary> /// 彩色图 /// </summary> ColorFormat = 3, /// <summary> /// 未知 /// </summary> UnKnown = -1 } /// <summary> /// 图像滤波 /// </summary> /// <param name="srcBmp">原始图像</param> /// <param name="filteringType">滤波算法类型</param> /// <param name="imageFormat">图像颜色格式</param> /// <param name="dstBmp">目标图像</param> /// <returns>处理成功 true 失败 false</returns> public static bool Filtering(Bitmap srcBmp, ScanStruction scanStruction, FilteringType filteringType, ImageFormats imageFormat, out Bitmap dstBmp) { if (srcBmp == null) { dstBmp = null; return false; } Bitmap grayBmp = null; dstBmp = new Bitmap(srcBmp); BitmapData bmpDataGray = null; if (imageFormat == ImageFormats.ColorFormat) { ToGray(srcBmp, out grayBmp); bmpDataGray = grayBmp.LockBits(new Rectangle(0, 0, grayBmp.Width, grayBmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); } BitmapData bmpDataSrc = srcBmp.LockBits(new Rectangle(0, 0, srcBmp.Width, srcBmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); BitmapData bmpDataDst = dstBmp.LockBits(new Rectangle(0, 0, dstBmp.Width, dstBmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); unsafe { byte[] grayValueArray = new byte[25]; long[] index = new long[25]; for (int i = 0; i < 25; i++) { grayValueArray[i] = 255; } byte* ptrSrc = (byte*)bmpDataSrc.Scan0; byte* ptrDst = (byte*)bmpDataDst.Scan0; byte* ptrGray = null; if (imageFormat == ImageFormats.ColorFormat) { ptrGray = (byte*)bmpDataGray.Scan0; } switch (filteringType) { case FilteringType.MedianFiltering://中值滤波 switch (scanStruction) { case ScanStruction.Horizontal3Bits: for (int i = 0; i < bmpDataSrc.Height; i++) { for (int j = 0; j < bmpDataSrc.Width; j++) { if (imageFormat == ImageFormats.ColorFormat) { grayValueArray[0] = ptrGray[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3]; grayValueArray[1] = ptrGray[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3]; grayValueArray[2] = ptrGray[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3]; grayValueArray[3] = ptrGray[i * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3]; grayValueArray[4] = ptrGray[i * bmpDataSrc.Stride + j * 3]; grayValueArray[5] = ptrGray[i * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3]; grayValueArray[6] = ptrGray[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3]; grayValueArray[7] = ptrGray[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3]; grayValueArray[8] = ptrGray[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3]; index[0] = Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3; index[1] = Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3; index[2] = Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3; index[3] = i * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3; index[4] = i * bmpDataSrc.Stride + j * 3; index[5] = i * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3; index[6] = (i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3; index[7] = (i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3; index[8] = (i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3; Array.Sort(grayValueArray, index); ptrDst[i * bmpDataDst.Stride + j * 3] = ptrSrc[index[4]]; ptrDst[i * bmpDataDst.Stride + j * 3 + 1] = ptrSrc[index[4] + 1]; ptrDst[i * bmpDataDst.Stride + j * 3 + 2] = ptrSrc[index[4] + 2]; } else { grayValueArray[0] = ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3]; grayValueArray[1] = ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3]; grayValueArray[2] = ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3]; grayValueArray[3] = ptrSrc[i * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3]; grayValueArray[4] = ptrSrc[i * bmpDataSrc.Stride + j * 3]; grayValueArray[5] = ptrSrc[i * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3]; grayValueArray[6] = ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3]; grayValueArray[7] = ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3]; grayValueArray[8] = ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3]; Array.Sort(grayValueArray); ptrDst[i * bmpDataDst.Stride + j * 3] = (byte)grayValueArray[4]; ptrDst[i * bmpDataDst.Stride + j * 3 + 1] = (byte)grayValueArray[4]; ptrDst[i * bmpDataDst.Stride + j * 3 + 2] = (byte)grayValueArray[4]; } } } break; case ScanStruction.Square5Bits://5*5 for (int i = 0; i < bmpDataSrc.Height; i++) { for (int j = 0; j < bmpDataSrc.Width; j++) { if (imageFormat == ImageFormats.ColorFormat) { grayValueArray[0] = ptrGray[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3]; grayValueArray[1] = ptrGray[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3]; grayValueArray[2] = ptrGray[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3]; grayValueArray[3] = ptrGray[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3]; grayValueArray[4] = ptrGray[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3]; grayValueArray[5] = ptrGray[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3]; grayValueArray[6] = ptrGray[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3]; grayValueArray[7] = ptrGray[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3]; grayValueArray[8] = ptrGray[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3]; grayValueArray[9] = ptrGray[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3]; grayValueArray[10] = ptrGray[i * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3]; grayValueArray[11] = ptrGray[i * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3]; grayValueArray[12] = ptrGray[i * bmpDataSrc.Stride + j * 3]; grayValueArray[13] = ptrGray[i * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3]; grayValueArray[14] = ptrGray[i * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3]; grayValueArray[15] = ptrGray[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3]; grayValueArray[16] = ptrGray[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3]; grayValueArray[17] = ptrGray[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3]; grayValueArray[18] = ptrGray[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3]; grayValueArray[19] = ptrGray[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3]; grayValueArray[20] = ptrGray[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3]; grayValueArray[21] = ptrGray[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3]; grayValueArray[22] = ptrGray[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3]; grayValueArray[23] = ptrGray[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3]; grayValueArray[24] = ptrGray[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3]; index[0] = Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3; index[1] = Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3; index[2] = Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3; index[3] = Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3; index[4] = Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3; index[5] = Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3; index[6] = Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3; index[7] = Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3; index[8] = Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3; index[9] = Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3; index[10] = i * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3; index[11] = i * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3; index[12] = i * bmpDataSrc.Stride + j * 3; index[13] = i * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3; index[14] = i * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3; index[15] = (i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3; index[16] = (i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3; index[17] = (i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3; index[18] = (i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3; index[19] = (i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3; index[20] = (i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3; index[21] = (i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3; index[22] = (i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3; index[23] = (i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3; index[24] = (i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3; Array.Sort(grayValueArray, index); ptrDst[i * bmpDataDst.Stride + j * 3] = ptrSrc[index[12]]; ptrDst[i * bmpDataDst.Stride + j * 3 + 1] = ptrSrc[index[12] + 1]; ptrDst[i * bmpDataDst.Stride + j * 3 + 2] = ptrSrc[index[12] + 2]; } else { grayValueArray[0] = ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3]; grayValueArray[1] = ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3]; grayValueArray[2] = ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3]; grayValueArray[3] = ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3]; grayValueArray[4] = ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3]; grayValueArray[5] = ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3]; grayValueArray[6] = ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3]; grayValueArray[7] = ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3]; grayValueArray[8] = ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3]; grayValueArray[9] = ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3]; grayValueArray[10] = ptrSrc[i * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3]; grayValueArray[11] = ptrSrc[i * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3]; grayValueArray[12] = ptrSrc[i * bmpDataSrc.Stride + j * 3]; grayValueArray[13] = ptrSrc[i * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3]; grayValueArray[14] = ptrSrc[i * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3]; grayValueArray[15] = ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3]; grayValueArray[16] = ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3]; grayValueArray[17] = ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3]; grayValueArray[18] = ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3]; grayValueArray[19] = ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3]; grayValueArray[20] = ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3]; grayValueArray[21] = ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3]; grayValueArray[22] = ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3]; grayValueArray[23] = ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3]; grayValueArray[24] = ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3]; Array.Sort(grayValueArray); ptrDst[i * bmpDataDst.Stride + j * 3] = grayValueArray[12]; ptrDst[i * bmpDataDst.Stride + j * 3 + 1] = grayValueArray[12]; ptrDst[i * bmpDataDst.Stride + j * 3 + 2] = grayValueArray[12]; } } } break; default: return false; } break; case FilteringType.MeanFiltering://均值滤波 byte tempB, tempG, tempR; switch (scanStruction) { case ScanStruction.Square3Bits: for (int i = 0; i < bmpDataSrc.Height; i++) { for (int j = 0; j < bmpDataSrc.Width; j++) { if (imageFormat == ImageFormats.ColorFormat) { tempB = (byte)((ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3] + ptrSrc[i * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3] + ptrSrc[i * bmpDataSrc.Stride + j * 3] + ptrSrc[i * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3]) / 9); tempG = (byte)((ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3 + 1] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3 + 1] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3 + 1] + ptrSrc[i * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3 + 1] + ptrSrc[i * bmpDataSrc.Stride + j * 3 + 1] + ptrSrc[i * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3 + 1] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3 + 1] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3 + 1] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3 + 1]) / 9); tempR = (byte)((ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3 + 2] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3 + 2] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3 + 2] + ptrSrc[i * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3 + 2] + ptrSrc[i * bmpDataSrc.Stride + j * 3 + 2] + ptrSrc[i * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3 + 2] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3 + 2] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3 + 2] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3 + 2]) / 9); ptrDst[i * bmpDataDst.Stride + j * 3] = tempB; ptrDst[i * bmpDataDst.Stride + j * 3 + 1] = tempG; ptrDst[i * bmpDataDst.Stride + j * 3 + 2] = tempR; } else { tempB = (byte)((ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3] + ptrSrc[i * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3] + ptrSrc[i * bmpDataSrc.Stride + j * 3] + ptrSrc[i * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3]) / 9); ptrDst[i * bmpDataDst.Stride + j * 3] = tempB; ptrDst[i * bmpDataDst.Stride + j * 3 + 1] = tempB; ptrDst[i * bmpDataDst.Stride + j * 3 + 2] = tempB; } } } break; case ScanStruction.Square5Bits: for (int i = 0; i < bmpDataSrc.Height; i++) { for (int j = 0; j < bmpDataSrc.Width; j++) { if (imageFormat == ImageFormats.ColorFormat) { tempB = (byte)((ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3] + ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3] + ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3] + ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3] + ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3] + + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3] + ptrSrc[i * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3] + ptrSrc[i * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3] + ptrSrc[i * bmpDataSrc.Stride + j * 3] + ptrSrc[i * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3] + ptrSrc[i * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3]) / 25); tempG = (byte)((ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3 + 1] + ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3 + 1] + ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3 + 1] + ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3 + 1] + ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3 + 1] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3 + 1] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3 + 1] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3 + 1] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3 + 1] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3 + 1] + ptrSrc[i * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3 + 1] + ptrSrc[i * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3 + 1] + ptrSrc[i * bmpDataSrc.Stride + j * 3 + 1] + ptrSrc[i * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3 + 1] + ptrSrc[i * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3 + 1] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3 + 1] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3 + 1] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3 + 1] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3 + 1] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3 + 1] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3 + 1] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3 + 1] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3 + 1] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3 + 1] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3 + 1]) / 25); tempR = (byte)((ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3 + 2] + ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3 + 2] + ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3 + 2] + ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3 + 2] + ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3 + 2] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3 + 2] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3 + 2] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3 + 2] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3 + 2] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3 + 2] + ptrSrc[i * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3 + 2] + ptrSrc[i * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3 + 2] + ptrSrc[i * bmpDataSrc.Stride + j * 3 + 2] + ptrSrc[i * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3 + 2] + ptrSrc[i * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3 + 2] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3 + 2] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3 + 2] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3 + 2] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3 + 2] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3 + 2] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3 + 2] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3 + 2] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3 + 2] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3 + 2] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3 + 2]) / 25); ptrDst[i * bmpDataDst.Stride + j * 3] = tempB; ptrDst[i * bmpDataDst.Stride + j * 3 + 1] = tempG; ptrDst[i * bmpDataDst.Stride + j * 3 + 2] = tempR; } else { tempB = (byte)((ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3] + ptrGray[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3] + ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3] + ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3] + ptrSrc[Math.Abs(i - 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3] + + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3] + ptrSrc[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3] + ptrSrc[i * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3] + ptrSrc[i * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3] + ptrSrc[i * bmpDataSrc.Stride + j * 3] + ptrSrc[i * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3] + ptrSrc[i * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3] + ptrSrc[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 2) % bmpDataSrc.Width * 3] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3] + ptrSrc[(i + 2) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 2) % bmpDataSrc.Width * 3]) / 25); ptrDst[i * bmpDataDst.Stride + j * 3] = tempB; ptrDst[i * bmpDataDst.Stride + j * 3 + 1] = tempB; ptrDst[i * bmpDataDst.Stride + j * 3 + 2] = tempB; } } } break; default: return false; } break; } srcBmp.UnlockBits(bmpDataSrc); dstBmp.UnlockBits(bmpDataDst); } return false; }
/// <summary> /// 获取图像的颜色格式:二值、灰度、彩色 /// </summary> /// <param name="bmp">位图图像</param> /// <returns>True 是灰度图 , False 不是灰度图</returns> public static ImageFormats GetImageFormat(Bitmap bmp) { if (bmp == null) { return ImageFormats.UnKnown; } bool isBinaryzation = true; Rectangle rt = new Rectangle(0, 0, bmp.Width, bmp.Height); BitmapData bmpData = bmp.LockBits(rt, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); unsafe { byte* ptr = null; for (int i = 2 * bmpData.Height / 5; i < 2 * bmpData.Height / 5 + 2; i++) { ptr = (byte*)bmpData.Scan0 + i * bmpData.Stride; for (int j = 0; j < bmpData.Width; j++) { if (ptr[j * 3 + 2] == ptr[j * 3 + 1] && ptr[j * 3 + 1] == ptr[j * 3]) { if ((ptr[j * 3 + 2] != 0 || ptr[j * 3 + 2] != 255) && isBinaryzation) { isBinaryzation = false; } continue; } else { bmp.UnlockBits(bmpData); return ImageFormats.ColorFormat; } } } } bmp.UnlockBits(bmpData); if (isBinaryzation) { return ImageFormats.BinaryzationFormat; } else { return ImageFormats.GrayFormat; } }
- 图像处理(八)图像滤波
- Python图像批处理(图像滤波处理)
- 图像处理(二):图像滤波
- 图像平滑处理(滤波)
- 图像处理-滤波技术
- 图像处理--中值滤波
- 图像处理:均值滤波
- [matlab 图像处理] 滤波
- 遥感图像滤波处理
- 【图像处理】滤波
- 图像处理自适应滤波
- 图像滤波处理对比
- 图像处理去噪点(中值滤波)java
- 图像处理(2)空间滤波
- 图像处理(3)频率域滤波
- 【OpenCV图像处理】十五、图像空域滤波(上)
- 【OpenCV图像处理】十六、图像空域滤波(下)
- 【python图像处理】图像的滤波(ImageFilter类详解)
- 理解ASM(七)ASM迁移
- 采集网www.caiji.hk 威客任务采集
- 匿名内部类implements(实现)interface(接口)
- 常用的多路复用模型总结
- 根据XML转换为C#类的对象
- 图像处理(八)图像滤波
- 最小费用流 SPFA 多路增广
- C++primer习题6.20
- uboot烧写完成后时代
- 《代码大全》学习笔记之— 基本数据类型(2)
- Project Euler problem 30
- 《设计模式》笔记-序言
- Java应用定制工厂--定制你自己的Java桌面程序(java exe)
- 敏捷开发案例--混乱小项目的敏捷应用