图像处理(八)图像滤波

来源:互联网 发布:不认盘数据恢复 编辑:程序博客网 时间:2024/05/16 14:02

均值滤波属于线性滤波方法,中值滤波属于非线性方法。他们都属于空间域内平滑方法。对于给定的图像f(x, y)中的每个像素点(x, y),取其邻域S­xy,设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;        }    }



 


原创粉丝点击