灰度直方图是灰度的函数,描述的是图像中具有该灰度级的像素的个数。如果用直角坐标系来表示,则它的横坐标是灰度级,纵坐标是该灰度出现的概率(像素的个数)。

灰度直方图的分布函数:

其中,K是指第k个灰度级,如果是8位灰度图像,k=0、1、……、255。

处理图像生成直方图数据

            //将图像数据复制到byte中
Rectangle rect = new Rectangle(0, 0, bmpHist.Width, bmpHist.Height);
System.Drawing.Imaging.BitmapData bmpdata = bmpHist.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bmpHist.PixelFormat);
IntPtr ptr = bmpdata.Scan0; int bytes = bmpHist.Width * bmpHist.Height * 3;
byte[] grayValues = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(ptr, grayValues, 0, bytes); //统计直方图信息
byte temp = 0;
maxPixel = 0;
Array.Clear(countPixel, 0, 256);
for (int i = 0; i < bytes; i++)
{
temp = grayValues[i];
countPixel[temp]++;
if (countPixel[temp] > maxPixel)
{
maxPixel = countPixel[temp];
}
} System.Runtime.InteropServices.Marshal.Copy(grayValues, 0, ptr, bytes);
bmpHist.UnlockBits(bmpdata);

绘制直方图信息

            //画出坐标系
Graphics g = e.Graphics;
Pen curPen = new Pen(Brushes.Black, 1); g.DrawLine(curPen, 50, 240, 320, 240);
g.DrawLine(curPen, 50, 240, 50, 30);
g.DrawLine(curPen, 100, 240, 100, 242);
g.DrawLine(curPen, 150, 240, 150, 242);
g.DrawLine(curPen, 200, 240, 200, 242);
g.DrawLine(curPen, 250, 240, 250, 242);
g.DrawLine(curPen, 300, 240, 300, 242);
g.DrawString("0", new Font("New Timer", 8), Brushes.Black, new PointF(46, 242));
g.DrawString("50", new Font("New Timer", 8), Brushes.Black, new PointF(92, 242));
g.DrawString("100", new Font("New Timer", 8), Brushes.Black, new PointF(139, 242));
g.DrawString("150", new Font("New Timer", 8), Brushes.Black, new PointF(189, 242));
g.DrawString("200", new Font("New Timer", 8), Brushes.Black, new PointF(239, 242));
g.DrawString("250", new Font("New Timer", 8), Brushes.Black, new PointF(289, 242));
g.DrawLine(curPen, 48, 40, 50, 40);
g.DrawString("0", new Font("New Timer", 8), Brushes.Black, new PointF(34, 234));
g.DrawString(maxPixel.ToString(), new Font("New Timer", 8), Brushes.Black, new PointF(18, 34)); double temp = 0;
for (int i = 0; i < 256; i++)
{
temp = 200.0 * countPixel[i] / maxPixel;
g.DrawLine(curPen, 50 + i, 240, 50 + i, 240 - (int)temp);
} curPen.Dispose();

全局变量定义及赋值

        private System.Drawing.Bitmap bmpHist;
private int[] countPixel;
private int maxPixel; public Grey_ScaleMapForm(Bitmap bmp)
{
InitializeComponent();
bmpHist = bmp;
countPixel = new int[256];
}

下载:DEMO

C#绘制数字图像灰度直方图的更多相关文章

  1. OpenCV实现灰度直方图和直方图拉伸

    原文链接:http://blog.csdn.net/xiaowei_cqu/article/details/7600666 如有疑问或者版权问题,请移步原作者或者告知本人. 灰度直方图是数字图像中最简 ...

  2. 灰度直方图及处理“cvQueryHistValue_1D”: 找不到标识符”的问题(上)

    // HIstogram.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "opencv2/opencv.hpp ...

  3. c#数字图像处理(三)灰度直方图

    灰度直方图是灰度的函数,描述的是图像中具有该灰度级的像素的个数.如果用直角坐标系来表示,则它的横坐标是灰度级,纵坐标是该灰度出现的概率(像素的个数). using System; using Syst ...

  4. Opencv——灰度直方图

    灰度直方图是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率. 如果将图像总像素亮度(灰度级别)看成是一个随机变量,则其分布情况就反映了图像的统计特性,这可用pro ...

  5. c程序设计语言_习题1-13_统计输入中单词的长度,并且根据不同长度出现的次数绘制相应的直方图

    Write a program to print a histogram of the lengths of words in its input. It is easy to draw the hi ...

  6. matlab显示原图和灰度直方图

    **只会显示灰度直方图I = imread('*.bmp') %图必须是灰度图,或者转换为灰度图I=rgb2gray(I);imshow(I);imhist(I); **同时出现在一个平面上I = i ...

  7. 肺结节CT影像特征提取(五)——肺结节CT影像ROI区域灰度直方图及其图形化

    在博客肺结节CT影像特征提取中,已经实现了肺结节的灰度.纹理和形态特征的提取.但是,对于进一步了解ROI区域像素值或者说CT值的分布来说,还存在一定的不足,不能够很好的显示ROI区域. 因此,本文将进 ...

  8. 基于FPGA的HDTV视频图像灰度直方图统计算法设计

    随着HDTV的普及,以LCD-TV为主的高清数字电视逐渐进入蓬勃发展时期.与传统CRT电视不同的是,这些高清数字电视需要较复杂的视频处理电路来驱动,比如:模数转换(A/D Converter).去隔行 ...

  9. opencv绘制灰度直方图

    代码之一: #include <cv.h> #include <highgui.h> #pragma comment( lib, "cv.lib" ) #p ...

随机推荐

  1. iframe自适应当前页面高度

    <style type="text/css"> *{margin:0;padding:0;list-style-type:none;} </style> & ...

  2. Python 执行linux 命令

    # !/usr/bin/env python # -*- coding: utf-8 -* import os def main(): file_list = os.popen("ls&qu ...

  3. JAVA-数据库之添加记录

    相关资料:<21天学通Java Web开发> 添加记录1.使用语句对象Statement的executeUpdate()方法可以很方便地实现添加记录.2.只需要在executUpdae() ...

  4. iOS实现tableViewCell或collectionCell中点击界面按钮跳转

    //找到父类界面 - (UIViewController *)viewController { for (UIView* next = [self superview]; next; next = n ...

  5. XXE漏洞初窥

    前言: XXE Injection即XML External Entity Injection也就是XML外部实体注入攻击.漏洞是在对非安全的外部实体数据进⾏行处理时引发的安全问题. XML相关名词科 ...

  6. Oracle 报错:PLS-00201: 必须声明标识符

    原因:调用其他用户的包或存储过程. 解决方法:在被调用的包或存储过程的用户下授权执行权限给调用用户: grant execute on 包名 to 用户名;

  7. 在dos下查看memcache运行状态

    在dos命令行下查看memcache运行状态,操作很简单,只需cmd下输入:telnet IP 端口号->stats  ,如果本机器不支持telnet还需安装,可以百度telnet的安装方法. ...

  8. jquery复选框 选中事件 及其判断是否被选中_常用笔记

    checkbox的change事件可监听是否选中状态,也可添加onclick事件. var dom=$('.checkbox'); 1. 判断checkbox是否被选中 var dom=$('.che ...

  9. 区块链blockchina简述

    区块链是比特币的底层技术和基础架构,本质上是一个去中心化的数据库.区块链是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一次比特币网络交易的信息,用于验证其信息的有效性(防伪)并生成下一个 ...

  10. MySQL 入门教程

    目录 一.MySQL的相关概念介绍 二.Windows下MySQL的配置 配置步骤 MySQL服务的启动.停止与卸载 三.MySQL脚本的基本组成 四.MySQL中的数据类型 五.使用MySQL数据库 ...