数字图像处理作业使用OpenCV - 自定义直方图
第二次作业需要打印出来灰度直方图,当然不能使用ocv的自带calcHist函数来得到Mat对象了……结果上网搜索怎么用自己的数据创建直方图,搜到的都是直接用函数的_(:з」∠)_
结果这个地方拖了好久呵呵呵呵呵呵呵。最后还是努力耐下性子来对照网上绘制灰度直方图的代码来看到底内藏什么玄机,结果发现其实真的,没什么,大不了(笑)(哭)。
基本思路:
建立一个Mat对象作为直方图的画布,将256个灰度级的数值的直方用rectangle或者line一个一个画出来。
……简直简单到我无法想象_(:з」∠)_论耐下性子的重要性(。
除此之外,还需要知道ocv里的坐标体系。原点是在图像的左上角,x轴是图像上方的边缘,y轴是图像左边的边缘。这一点对于画基本图形是非常重要的。
首先转载一下网上csdn博客xiaowei_cqu的画灰度直方图的代码。
//绘制灰度直方图
int main( )
{
Mat src,gray;
src=imread("baboon.jpg");
cvtColor(src,gray,CV_RGB2GRAY);
int bins = ;
int hist_size[] = {bins};
float range[] = { , };
const float* ranges[] = { range};
MatND hist;
int channels[] = {};
//使用ocv自带函数计算灰度直方图
calcHist( &gray, , channels, Mat(), // do not use mask
hist, , hist_size, ranges,
true, // the histogram is uniform
false ); //画出直方图
double max_val;
minMaxLoc(hist, , &max_val, , );
int scale = ;
int hist_height=;
Mat hist_img = Mat::zeros(hist_height,bins*scale, CV_8UC3);
for(int i=;i<bins;i++)
{
float bin_val = hist.at<float>(i);
int intensity = cvRound(bin_val*hist_height/max_val); //要绘制的高度
rectangle(hist_img,Point(i*scale,hist_height-),
Point((i+)*scale - , hist_height - intensity),
CV_RGB(,,));
}
imshow( "Source", src );
imshow( "Gray Histogram", hist_img );
waitKey();
return ;
}
我需要关注的就是【画出直方图】这一块代码。
可以发现,这个直方图是将每一个区间长度定位2pixel,直方图画布的长是【区间数 * 区间长度】= 256*2 = 512,高为256,初始化为一幅黑色画布。
进入画直方图阶段,简单来说,就是取出图像的灰度频率表(每个灰度值占整个图像的像素数)的每一个值,计算出绘制高度,根据这个绘制高度去划线或者矩形。
绘制高度,是【矩形高度 * 画布高度 / 最大矩形高度】,为啥要这样设置,应该是跟概率统计直方图有关吧……
这里使用了rectangle即画矩形来代表每一个区间。
//参数为:承载对象(此处为Mat)、左下角点、右上角点、颜色、粗细、大小
rectangle(picture,a,center,Scalar(255,0,0));
当然也可以用line即线段来代表一个区间。
//参数为:承载对象(此处为Mat)、起始点、结束点、颜色、粗细、线型
line(picture,a,center,Scalar(255,0,0));
由于ocv一般的坐标体系如上所述,所以对应习惯的坐标系,x轴应该是坐标为(x, 255)的线,至于为什么是255,是为了能显示出高度为0的区间。
而rectangle的两个点的参数为什么是这样,让我来画一张示意图。
假设此时要要画(Point(0, hist_height - 1), Point(1, hist_height-intensity))的矩形。

按照以上的代码修改之后,我也可以用自己的数据来画一个直方图了QAQ感天动地。
以上内容参考了这几个博客,包括直方图绘制代码,OCV的坐标体系和画基本图形的函数,感谢分享!
http://blog.csdn.net/panda1234lee/article/details/14162965
http://blog.csdn.net/thefutureisour/article/details/7523925
http://blog.csdn.net/xiaowei_cqu/article/details/8833799
http://blog.csdn.net/xiaowei_cqu/article/details/7600666
数字图像处理作业使用OpenCV - 自定义直方图的更多相关文章
- 数字图像处理作业使用OpenCV - 使用笔记
数字图像处理作业的输入图像全部都是灰度图像,所以汇总一下自己遇到的问题答案. OCV的图像容器是Mat<typename>,可以用imread(filename)读取图像,filename ...
- 数字图像处理作业使用OpenCV - 配置
使用环境:Windows7 旗舰版 + vs2008 + OpenCV2.0a 基本上配置都是通过网上一个教程,在此附上地址 Click ME. 为了避免因不同版本而出现的安装问题,我还是下载了2.0 ...
- 数字图像处理作业使用OpenCV - 块提取
今天要记录的是树图第二次作业的第二题,Image Patch Extraction.这个概念真的不难懂,但是如果要我实际写的话,还真的不知道要怎么去遍历图像矩阵来提取块.在此要多谢邓大神的热心帮助,告 ...
- BJUT数字图像处理作业
一. n的正方形图像,用FFT算法从空域变换到频域,并用频域图像的模来进行显示. 2) 使图像能量中心,对应到几何中心,并用频域图像的模来进行显示. 3)将频域图象,通过FFT逆变换到空域,并显示. ...
- python数字图像处理(9):直方图与均衡化
在图像处理中,直方图是非常重要,也是非常有用的一个处理要素. 在skimage库中对直方图的处理,是放在exposure这个模块中. 1.计算直方图 函数:skimage.exposure.histo ...
- c#数字图像处理(三)灰度直方图
灰度直方图是灰度的函数,描述的是图像中具有该灰度级的像素的个数.如果用直角坐标系来表示,则它的横坐标是灰度级,纵坐标是该灰度出现的概率(像素的个数). using System; using Syst ...
- OpenCV-跟我一起学数字图像处理之直方图均衡化
从这篇博文开始,小生正式从一个毫不相干专业转投数字图像处理.废话不多说了,talk is cheap. show me the code. 直方图均衡化目的 由于一些图像灰度的分布过于集中,这样会导致 ...
- Win8 Metro(C#)数字图像处理--3.3图像直方图计算
原文:Win8 Metro(C#)数字图像处理--3.3图像直方图计算 /// <summary> /// Get the array of histrgram. /// </sum ...
- Win8Metro(C#)数字图像处理--2.34直方图规定化
原文:Win8Metro(C#)数字图像处理--2.34直方图规定化 [函数名称] WriteableBitmap HistogramSpecificateProcess(WriteableBi ...
随机推荐
- MySql SELECT INTO 记录为空的问题
SELECT Id INTO @Id FROM GiftCode WHERE Status = 1 AND GiftId = #GiftId# ORDER BY Id ASC LIMIT 1; ...
- Windows Azure 将正式更名为 Microsoft Azure
微软的公共云平台在2014年4月3日正式从Windows Azure 更名为Microsoft Azure. windows azure是二级产品名,microsoft azure是一级产品名,和mi ...
- WebSphere MQ Explorer的sqlserver的jdbc
一.IBM WebSphere MQ7.0的jdbc支持数据库有: DB2 Informix Informix_With_Date_Format Microsoft_SQL_Server Oracle ...
- Linux中环境变量文件及配置
Linux中环境变量文件及配置 一.环境变量文件介绍 转自:http://blog.csdn.net/cscmaker/article/details/7261921 Linux中环境变量包括系统 ...
- 浅析Java.lang.Process类
一.概述 Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序). Process 类提供了执行从进程输入.执行输出到进程.等待进程完成.检查进程的 ...
- python :添加的内容具有之前的功能用delegate绑定事件
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- java读取输入流
java读取输入流两种 private static byte[] readStream(InputStream in){ if(in==null){ return null; } byte[] bu ...
- Radmin Center 1.54 测试版
软件简介:radmin center 用于集中管理安装了 radmin server 的服务器,支持一键远程管理,数据全部本地存储,关键数据使用RC4变形加密.同时保留了radmin的高安全性和高易用 ...
- mac os 禁止apache httpd自动启动(转)
mac os 禁止apache httpd自动启动 博客分类: 计算机使用 mac os不像linux有/etc/init.d/rc.local以及service的方式可以设置程序随机启动,而是使 ...
- 渗透杂记-2013-07-13 windows/mssql/mssql_payload
扫描一下 Starting Nmap 5.30BETA1 ( http://nmap.org ) at 2011-05-06 09:36 中国标准时间 NSE: Loaded 49 scripts f ...