C# 指针操作图像 二值化处理

/// <summary>
/// 二值化图像
/// </summary>
/// <param name="bmp"></param>
/// <returns></returns>
private static unsafe Bitmap Binaryzation(Bitmap bmp)
{
BitmapData dstData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
byte* data = (byte*)(dstData.Scan0);
//将图像转换为0,1二值得图像;
int step = dstData.Stride;

int means = getThreshold(data, bmp.Height * step);
for (int y = 0; y < bmp.Height; y++)
{
for (int x = 0; x < bmp.Width * 3; x += 3)
{
if (data[y * step + x + 2] > means)
data[y * step + x]
= data[y * step + x + 1]
= data[y * step + x + 2]
= 255;
else
data[y * step + x]
= data[y * step + x + 1]
= data[y * step + x + 2]
= 0;
}
}
bmp.UnlockBits(dstData);
return bmp;
}

/// <summary>
/// 图像二值化 获取阀值
/// </summary>
/// <param name="inPixels"></param>
/// <param name="length">height * Stride</param>
/// <returns></returns>
private static unsafe int getThreshold(byte* inPixels, int length)
{
int inithreshold = 127;
int finalthreshold = 0;
List<int> temp = new List<int>();
for (int index = 0; index < length; index += 3)
{
temp.Add(inPixels[index + 2]);
}
List<int> sub1 = new List<int>();
List<int> sub2 = new List<int>();
int means1 = 0, means2 = 0;
while (finalthreshold != inithreshold)
{
finalthreshold = inithreshold;
for (int i = 0; i < temp.Count(); i++)
{
if (temp[i] <= inithreshold)
{
sub1.Add(temp[i]);
}
else
{
sub2.Add(temp[i]);
}
}
means1 = getMeans(sub1);
means2 = getMeans(sub2);
sub1.Clear();
sub2.Clear();
inithreshold = (means1 + means2) / 2;
}
return finalthreshold;
}

/// <summary>
/// 图像二值化 获取Means
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private static int getMeans(List<int> data)
{
int result = 0;
int size = data.Count();
foreach (int i in data)
{
result += i;
}
return (result / size);
}

 

 

转 https://www.cnblogs.com/mahatmasmile/p/4247709.html

posted @   dreamw  阅读(241)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示