将二值图像存入二值数组

Posted dearzhoubi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将二值图像存入二值数组相关的知识,希望对你有一定的参考价值。

因项目需要,需要用一个将二值图像保存在二维数组中的算法,在网上找了很久都没找到,只能自己动手写了。

        #region 读取二值图像存入二值数组

        public byte[,] BinaryBitmapToBinaryArray(Bitmap bmp)
        {
            int imgWidth = bmp.Width;
            int imgHeight = bmp.Height;

            byte[,] BinaryArray = new byte[imgHeight, imgWidth];
            for (int i = 0; i < BinaryArray.GetLength(0); i++)
            {
                for (int j = 0; j < BinaryArray.GetLength(1); j++)
                {
                    BinaryArray[i, j] = 1;
                }
            }
            int depth = Bitmap.GetPixelFormatSize(bmp.PixelFormat);
            if (depth == 1)
            {
                Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
                BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);
                int imgStride = bmpData.Stride;
                //得到首地址
                IntPtr ptr = bmpData.Scan0;

                //定义被锁定的数组大小,由位图数据与未用空间组成的
                int bytes = imgStride * imgHeight;
                //定义位图数组
                byte[] bmpValues = new byte[bytes];
                //复制被锁定的位图像素值到该数组内
                Marshal.Copy(ptr, bmpValues, 0, bytes);

                int basePos = 0;
                bool isOne = false;
                for (int y = 0; y < imgHeight; y++)
                {
                    basePos = y * imgStride;
                    for (int x = 0; x < imgWidth; x ++)
                    {
                        isOne = ByteGetBit(bmpValues[basePos + (x >> 3)], (7-x & 0x7));
                        //ByteGetBit判断一个字节第几位是否是1,该函数是从后往前数的,而这里是从高位向低位数的。所以要用7减去x & 0x7
                        if (isOne)
                        {
                            BinaryArray[y, x] = 255;
                        }
                        else
                        {
                            BinaryArray[y, x] = 0;
                        }
                    }
                }
                        bmp.UnlockBits(bmpData);
            }
            return BinaryArray;
        } 

        #endregion

 

以上是关于将二值图像存入二值数组的主要内容,如果未能解决你的问题,请参考以下文章

81 数字验证码识别实例

取消酸洗后将二值化数据帧反转为原始分类值

利用python将二值csv格式转换为矩阵

二值图像进行拉普拉斯锐化后产生的负数怎么办

二值图像分类选择啥算法

二值化之后的图像为单通道,那么还能转换为多通道吗