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

 

 

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

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

 首先找到最大数

int max;
for(int i=1;i<256;i++)
{
     if(max<h[i])
     {
          max=h[i];
     }  
}

//标准化

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

 

posted @ 2013-11-02 21:30  种花生的读书人  阅读(828)  评论(0编辑  收藏  举报

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