数字图像处理作业使用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 ...
随机推荐
- Spring学习笔记之五----Spring MVC
Spring MVC通常的执行流程是:当一个Web请求被发送给Spring MVC Application,Dispatcher Servlet接收到这个请求,通过HandlerMapping找到Co ...
- Upload Images
ASP.NET图片批量上传,可预览带进度条 http://www.okbase.net/file/item/5492
- WAV文件头相关资料
http://stackoverflow.com/questions/6284651/avaudiorecorder-doesnt-write-out-proper-wav-file-header h ...
- OC-@property、self及类的本质
让代码书写更加简便 --1-- 设置器和访问器 1.1 setter 1.2 getter --2-- 类的本质 2.1 类类型的对象 2.2 类的本质 2.3 如何获取类对象 2.4 类对象的使用 ...
- asp.net-枚举绑定控件
1.DropDownList asp.net页面: <asp:DropDownList ID="drpTemplateType" runat="server&quo ...
- vs快捷键大全
前言 作为一个.net开发员,你还在用鼠标去点击相应的操作么?如果你回答是,那么你太low了! 一个很厉害的程序员不会是那种这鼠标到处狂点的人,他们肯定会很多快捷键,所以为了离他们更近一步,我们必须学 ...
- ANGULAR JS WATCH监听使用(详)
ANGULAR 监听使用: 当angular数据模型发生变化时,我们需要如果需要根据他的变化触发其他的事件. $watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你. ...
- Using FreeMarker templates (FTL)- Tutorial
Lars Vogel, (c) 2012, 2016 vogella GmbHVersion 1.4,06.10.2016 Table of Contents 1. Introduction to F ...
- DbContext 那些事 —— 数据库初始化
数据库初始化 上图,这个图解释了,数据库初始化的流程,是基于我们在上下文类中的构造函数中传递的参数. 在上面的图中,context类中的base构造器中,可以填入下面的参数: 无参数(No Param ...
- 韩国手机游戏Elf Defense角色场景
! [复制链接] CG窝微博 签到天数: 36 天 连续签到: 1 天 [LV.5]常住居民I 22 主题 0 精华 2729 窝币 超级版主 积分 2546 收听TA 发消息 电梯直达 楼主 ...