C#+vs2019windos窗口实现数字图像基础处理(灰度化,二值化,对比度,亮度)

一、灰度化

在三原色理论中,所有颜色都是以红、绿、蓝三原色按不同比例混合构成的,不同的红、绿、蓝三原色比例构成了不同的颜色。
而灰度数字图像指的是图像中每个像素只有一个采样颜色的图像,通常显示为从最暗黑色到最亮的白色的灰度。本质上灰度数字图像中像素点中三原色的比例相同,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灰度值,完成灰度图像的转换
 }

实现效果如下:

Alt

二、亮度

亮度是指图像色彩的明暗程度,是人眼对物体明暗强度的感觉,取值为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)的像素
 }

实现效果如下:
Alt

三、对比度

对比度调节的实质是使图像中各像素的亮度分布发生变化,对比度增强时亮的点更亮,
暗的点更暗,对比度减弱则相反。
代码原理:首先获取图像每个像素点的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);
 }

实现效果:
Alt

四、可变阈值二值化

二值图像是指将图像上的每一个像素只有两种可能的取值或灰度等级状态,每个像素不是黑就是白。
代码原理:此处的可变阈值二值化,便是自选一个阈值,若该像素点的亮度大于此阈值,则用白色表示;低于该阈值,用黑色表示。
核心代码:

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); //将黑色变量赋给当前像素点
 } 
 }

实际演示如下:
Alt

五、自适应二值化

自适应二值化与可变阈值二值化的区别就在于,自适应二值化能根据算法求得一个合适的阈值,不需要人手动调整最佳阈值。
代码原理:实话说我还没搞清楚求阈值的算法原理
核心代码如下:

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);
 }


实际演示如下:

Alt

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
搭建NFS(Network File System)是一种在Windows Server 2019上实现网络文件共享的方法。以下是一个简单的步骤指南: 1. 安装NFS角色和服务:登录到Windows Server 2019系统,打开“服务器管理器”,选择“添加角色和功能”向导。在向导中选择“服务器角色”页面,勾选“文件和存储服务”角色,并在“功能”页面选择“NFS服务”功能。完成安装并重启服务器。 2. 配置NFS共享:在服务器管理器中,打开“文件和存储服务”→“共享与存储管理”。在左侧导航栏中,选择“共享”→“新共享”,选择要共享的文件夹,并在共享属性中配置NFS共享的设置,比如选择共享协议为NFS、权限和用户访问控制等。 3. 配置NFS服务器:在“NFS共享”属性中,可以更进一步配置NFS服务器的设置。比如,您可以设置在Windows系统中创建的新文件和文件夹的默认权限,选择NFS版本,配置身份验证设置等。 4. 设置NFS访问权限:在“共享和存储管理”中,选择“共享权限”。在这里,您可以为特定的NFS共享设置访问权限,可以基于用户进行设置、基于组进行设置或者使用通用访问权限。 5. 测试NFS共享:在其他计算机上使用NFS客户端工具尝试访问新设置的NFS共享。确保您可以成功连接和访问服务器上的共享文件夹,并且文件读写操作正常。 通过以上步骤,您可以在Windows Server 2019上搭建NFS并实现文件共享。但请注意,这只是一个简单示例,实际操作中还可能涉及网络配置、安全设置以及特定的需求和限制等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值