目录
- 一、灰度化
- 二、亮度
- 三、对比度
- 四、可变阈值二值化
- 五、自适应二值化
一、灰度化
在三原色理论中,所有颜色都是以红、绿、蓝三原色按不同比例混合构成的,不同的红、绿、蓝三原色比例构成了不同的颜色。
而灰度数字图像指的是图像中每个像素只有一个采样颜色的图像,通常显示为从最暗黑色到最亮的白色的灰度。本质上灰度数字图像中像素点中三原色的比例相同,0-255个灰度。
RGB图片转化为灰度图片,就是将RGB图像中每一个像素转化为灰度,通常采用 Gray=(R*30+G*59+B*11)/100
公式转化。
核心代码如下:
Bitmap bt = new Bitmap(pictureBox1.Image);
Bitmap bt1 =neBitmap(pictureBox1.Image);//定义并初始化两个位图对象
Color color = new Color();//定义一个颜色对象
for (int i = 0; i < bt.Width; i++)
{
for (int j = 0; j < bt.Height; j++)
{
color = bt.GetPixel(i, j); //遍历整张图像,获取每个像素的色彩信息
int n = (int)((color.G * 59 + color.R * 30 + color.B * 11) / 100); //根据GRB的不同的权值计算每个像素点的亮度,利用该亮度作为灰度图像中每个像素的灰度值
bt1.SetPixel(i,j,Color.FromArgb(n,n,n)); //给该像素的每种色彩分量均赋予相同的附录 A 数字图像处理基本算法的 C#程序实现 310灰度值,完成灰度图像的转换
}
实现效果如下:
二、亮度
亮度是指图像色彩的明暗程度,是人眼对物体明暗强度的感觉,取值为0%–100%。
所以亮度调节就是修改像素分量的值使得其根据调节值改变图像的亮度。
代码原理:首先提取出图像的每个像素点的RGB分量,根据所要求调整的图像亮度同时同量地改变每个像素点的RGB值。
例如:增加图像亮度10个值,则对图像的每个像素点的RGB分量值进行加10操作,但是要注意RGB值需位于0-255之间。
核心代码:
for (int j = 0; j < bt1.Height; j++)
{
//获取位于(i,j)坐标的像素然后提取RGB分量
Color color = bt.GetPixel(i, j);
r = color.R;
g = color.G;
b = color.B;
//对RGB分量进行增加或删除,增加量为滑杆滑动的量
r += value;
g += value;
b += value;
if (r > 255) r = 255; //判断各颜色分量的值是否超出各分量允许的范围,如果大于255则只能等于255
if (r < 0) r = 0; //如果小于0则只能等于0
if (g > 255) g = 255;
if (g < 0) g = 0;
if (b > 255) b = 255;
if (b < 0) b = 0;
Color c1 = Color.FromArgb(r, g, b); //用调整后的值生成新的颜色对象
bt1.SetPixel(i, j, c1); //把新的颜色c1赋给bt1位图对象在坐标为(i,j)的像素
}
实现效果如下:
三、对比度
对比度调节的实质是使图像中各像素的亮度分布发生变化,对比度增强时亮的点更亮,
暗的点更暗,对比度减弱则相反。
代码原理:首先获取图像每个像素点的RGB分量值,获取此次对比度的调整值,然后根据此次对比度调整值得到像素点RGB分量的变化值,然后将RGB分量值分出强弱,较强的RGB分量加上变化值,较弱的RGB分量减去变化值。
核心代码如下:
for (int i = 0; i < bt1.Width; i++)
{
for (int j = 0; j < bt1.Height; j++)
{
//获取位于(i,j)坐标的像素然后提取RGB分量
Color c = bt.GetPixel(i, j);
r = c.R;
g = c.G;
b = c.B;
//对RGB分量进行变换
int rg = (Math.Abs(127 - r) * degree) / 255;
int gg = (Math.Abs(127 - g) * degree) / 255;
int bg = (Math.Abs(127 - b) * degree) / 255;
//这个判断的作用是使得颜色对比度更加明显也就是亮度更亮暗的更暗
if (r > 127) r = r + rg;
else r = r - rg;
if (g > 127) g = g + gg;
else g = g - gg;
if (b > 127) b = b + bg;
else b = b - bg;
//判断三分量是否超过了取值范围
if (r > 255) r = 255;
if (r < 0) r = 0;
if (g > 255) g = 255;
if (g < 0) g = 0;
if (b > 255) b = 255;
if (b < 0) b = 0;
Color c1 = Color.FromArgb(r, g, b);
//把新的像素赋值bt1位图对象在坐标为(i,j)的像素
bt1.SetPixel(i, j, c1);
}
实现效果:
四、可变阈值二值化
二值图像是指将图像上的每一个像素只有两种可能的取值或灰度等级状态,每个像素不是黑就是白。
代码原理:此处的可变阈值二值化,便是自选一个阈值,若该像素点的亮度大于此阈值,则用白色表示;低于该阈值,用黑色表示。
核心代码:
for (int j = 0; j <= pictureBox1.Image.Height - 1; j++)//循环处理图像中的每一个像素点
{
ColorOrigin = Bmp1.GetPixel(i, j); //获取当前像素点的色彩信息
Red = ColorOrigin.R; //获取当前像素点的红色分量
Green = ColorOrigin.G; //获取当前像素点的绿色分量
Blue = ColorOrigin.B; //获取当前像素点的蓝色分量
Y = 0.59 * Red + 0.3 * Green + 0.11 * Blue; //计算当前像素点的亮度
if (Y>brightThreshole) //如果当前像素点的亮大于指定阈值
{
Color ColorProcessed = Color.FromArgb(255, 255, 255); //那么定义一个纯白
的色彩变量,即各分量均为255
Bmp1.SetPixel(i, j, ColorProcessed); //将白色变量赋给当前像素点
}
if (Y <= brightThreshole) //如果当前像素点的度小于指定阈值
{
Color ColorProcessed = Color.FromArgb(0, 0, 0); //那么定义一个纯黑的色彩
变量,即各分量均为0
Bmp1.SetPixel(i, j, ColorProcessed); //将黑色变量赋给当前像素点
}
}
实际演示如下:
五、自适应二值化
自适应二值化与可变阈值二值化的区别就在于,自适应二值化能根据算法求得一个合适的阈值,不需要人手动调整最佳阈值。
代码原理:实话说我还没搞清楚求阈值的算法原理
核心代码如下:
for(int i=1;i<pictureBox1.Image.Width-1;i++)
{
for(int j=1;j<pictureBox1.Image.Height-1;j++)
{
c=box1.GetPixel(i,j);
r=c.R;
array[i,j]=r;
}
}
//灰度值在0-256之间变换,再次扫描图像,把相同灰度值的累加起来
for(int i=1;i<pictureBox1.Image.Width;i++)
{
for(int j=1;j<pictureBox1.Image.Height;j++)
{
for(int k=0;k<255;k++)
{
if(array[i,j]==k)
{
tt[k]=tt[k]+1;
}
}
}
}
//求出图像里含有的各个灰度值所占的百分比
for(int m=0;m<255;m++)
{
p[m]=tt[m]/(pictureBox1.Image.Width*pictureBox1.Image.Height);
}
//求灰度均值
for(int n = 1;n<256;n++)
{
u=u+(n-1)*p[n];
}
//求灰度类均值和直方图和
for(int i=1;i<256;i++)
{
uu[i]=uu[i-1]+(i-1)*p[i];
w[i]=w[i-1]+p[i];
if(w[i]*(1-w[i-1])!=0)
{
b[i]=((u*w[i]-uu[i])*(u*w[i]-uu[i]))/(w[i]*(1-w[i]));
}
}
//初始化函数最大值
max=b[0];
//求出使函数达到最大值的变量
for(int i=0;i<255;i++)
{
if(b[i]>=max)
{
max=b[i];
}
}
for(int j=0;j<255;j++)
{
if(b[j]==max)
maxb=j;
}
//最佳阈值就是maxb-1,然后根据阈值对灰度图像进行二值化处理
for(int i=1;i<pictureBox1.Image.Width;i++)
{
for(int j=1;j<pictureBox1.Image.Height;j++)
{
c=box1.GetPixel(i,j);
r=c.R;
if(r>(maxb-1))
box1.SetPixel(i,j,cc2);
else
box1.SetPixel(i,j,cc1);
}
实际演示如下:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)