
谁能帮忙解释下C#二值化处理图片的代码?thanks!
publicbyte[,]Gray(Bitmapb,intThrshold)//二值化函数{byte[,]ImageData=newbyte[10000,10000];B...
public byte[,] Gray(Bitmap b, int Thrshold) //二值化函数
{
byte[,] ImageData = new byte[10000, 10000];
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;
unsafe
{
byte* p = (byte*)(void*)Scan0;
int nOffset = stride - b.Width * 3;
byte red, green, blue;
int nWidth = b.Width;
int nHeight = b.Height;
for (int y = 0; y < nHeight; ++y) //获取数据
{
for (int x = 0; x < nWidth; ++x)
{
blue = p[0];
green = p[1];
red = p[2];
if (p[0] < Thrshold)
{
p[0] = p[1] = p[2] = (byte)(0);
ImageData[x, y] = 1;
}
else
{
p[0] = p[1] = p[2] = (byte)(255);
ImageData[x, y] = 0;
}
p += 3;
}
p += nOffset;
}
}
b.UnlockBits(bmData);
return ImageData;
} 展开
{
byte[,] ImageData = new byte[10000, 10000];
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;
unsafe
{
byte* p = (byte*)(void*)Scan0;
int nOffset = stride - b.Width * 3;
byte red, green, blue;
int nWidth = b.Width;
int nHeight = b.Height;
for (int y = 0; y < nHeight; ++y) //获取数据
{
for (int x = 0; x < nWidth; ++x)
{
blue = p[0];
green = p[1];
red = p[2];
if (p[0] < Thrshold)
{
p[0] = p[1] = p[2] = (byte)(0);
ImageData[x, y] = 1;
}
else
{
p[0] = p[1] = p[2] = (byte)(255);
ImageData[x, y] = 0;
}
p += 3;
}
p += nOffset;
}
}
b.UnlockBits(bmData);
return ImageData;
} 展开
1个回答
展开全部
这代码写的很低效,不过还算清晰。
灰度处理那个很简单吧,基本上C#都自动帮你做了,你那代码就是手动遍历其中每个像素然后读取其灰度值(这里代码偷懒直接让C#帮忙计算了)然后重新把像素设置为RGB都是灰度值的颜色而已。
二值化的其实也不复杂,也是逐个遍历像素,判断某个像素的亮度是否大于给定阈值,如果大于则设置为白色否则设置为黑色。唯一有点麻烦的是要把8个像素合并到一个字节里面,于是代码里面搞了个scan数组,然后八个像素为一组填进去,每个像素占字节的一个位(白1黑0)。使用位运算0x80 >> (x % 8)保证像素从左到右依次保存在字节的8个位上。你这个二值化代码回填像素信息的时候用的是Marshal的字节拷贝而已,你只要知道了位图的结构这个理解也很简单。
灰度处理那个很简单吧,基本上C#都自动帮你做了,你那代码就是手动遍历其中每个像素然后读取其灰度值(这里代码偷懒直接让C#帮忙计算了)然后重新把像素设置为RGB都是灰度值的颜色而已。
二值化的其实也不复杂,也是逐个遍历像素,判断某个像素的亮度是否大于给定阈值,如果大于则设置为白色否则设置为黑色。唯一有点麻烦的是要把8个像素合并到一个字节里面,于是代码里面搞了个scan数组,然后八个像素为一组填进去,每个像素占字节的一个位(白1黑0)。使用位运算0x80 >> (x % 8)保证像素从左到右依次保存在字节的8个位上。你这个二值化代码回填像素信息的时候用的是Marshal的字节拷贝而已,你只要知道了位图的结构这个理解也很简单。

2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询