Fork me on GitHub

图像处理-02-绘制图像灰度直方图

绘制图像灰度直方图

在绘制图像灰度时我们要考虑到在WinForm中坐标轴的走向,左上角为原点,向右为X轴,向下为Y轴

复制代码
private void btnImageOperation_Click( object sender, EventArgs e )
        {
            int height = this.pbImageOld.Image.Height;
            int width = this.pbImageOld.Image.Width;
            int[]imageArr=new int[256];
            for (int i = 0; i <= 255; i++)
            {
                imageArr[i] = 0;
            }

            Color pixel;
            int gray, r, g, b;
            Bitmap bitmap=(Bitmap)this.pbImageOld.Image;

            for (int i = 0; i < height; i++)
            {
                for (int j = 0; j < width; j++)
                {
                    pixel = bitmap.GetPixel(j,i);//获取指定坐标对应的像素点的颜色
                    r = pixel.R;
                    g = pixel.G;
                    b = pixel.B;
                    gray = (int)(0.3 * r + 0.59 * g + 0.11 * b);//将RGB换成灰度
                    imageArr[gray] = imageArr[gray] + 1;//这个亮度的值加1
                }
            }

            Bitmap delImage = new Bitmap( 256, 256 );//直方图
            using (Graphics graphics = Graphics.FromImage( delImage ))
            {
                for (int x = 0; x < delImage.Width; x++)
                {
                    //graphics.DrawLine( Pens.Black, 0, x, imageArr[x], x );//每个色阶画一条直线
                    graphics.DrawLine(Pens.Black,x,255,x,(255-imageArr[x]));//对应坐标(x,y) (x,y)
                }
            }
            pbImageNew.Image = delImage;
        }
复制代码

 

 

改进以上算法,提出数值的标准化。

改进原因,如果有一个颜色的平均值非常大,那么其值在图像上是无法显示的

 首先找到最大数

1
2
3
4
5
6
7
8
int max;
for(int i=1;i<256;i++)
{
     if(max<h[i])
     {
          max=h[i];
     
}

//标准化

h[i]=h[i]*256/max;

 

posted @   种花生的读书人  阅读(904)  评论(0编辑  收藏  举报
编辑推荐:
· 大模型 Token 究竟是啥:图解大模型Token
· 35岁程序员的中年求职记:四次碰壁后的深度反思
· 继承的思维:从思维模式到架构设计的深度解析
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
阅读排行:
· BotSharp + MCP 三步实现智能体开发
· 动物智能之数据标注员——狗篇
· 5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
· 设计模式脉络
· BotSharp 5.0 MCP:迈向更开放的AI Agent框架

该博客仅作为记录笔记,转载随意

点击右上角即可分享
微信分享提示