数字图像处理作业使用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 ...
随机推荐
- cocopods 安装与使用
iOS 最新版 CocoaPods 的安装流程 1.移除现有Ruby默认源 $gem sources --remove https://rubygems.org/ 2.使用新的源 $gem sourc ...
- [转载] 不查资料确定int型整数的最大值和最小值
原文地址:http://blog.csdn.net/zhanghuoding/article/details/42719213 想法来自于书中的习题. Java的话直接输出 Integer.MAX_V ...
- 闲鱼demo
编程是一种美德,是促使一个人不断向上发展的一种原动力 -----–以下是正文------- 最近好多app的底部标签导航使用以下形式了,所以我们就来学习一下它是如何实现的. 先看效果: 中间的&quo ...
- python导入opencv解决no module named cv2问题
最近ubuntu用的比较多,在写神经网络代码时也会经常接触到python,但是python的环境配置确实是个头疼的问题. 尤其是接触到opencv时,需要导入opencv的库文件,网上也有很多方法,本 ...
- Oracle Grid Infrastructure安装部署文档
1. 部署环境步骤 1.1 软件环境 操作系统: CentOS release 6.5 oracle安装包: linux.x64_11gR2_grid.zip linux.x64_11gR2_data ...
- jQ中对attr()方法的理解
在JS中设置节点的属性与属性值用到setAttribute(),获得节点的属性与属性值用到getAttribute(),而在jquery中,用一个attr()就可以全部搞定了,赞一个先 ^^jquer ...
- 不写完不让回家的JQuery的事件与动画
在这看不见太阳的小黑屋里,苦逼的一天又开始了 好了闲话我也就不扯了,接下来我就来说说我对jQuery事件和动画的理解吧!!! 还是得再扯两句,我们敬爱的,Y老师讲完了,jQuery事件和动画,对着我们 ...
- 用CSS制作伪标签云
performance testing stress testing conformance testing acceptane testing smoke testing regression te ...
- Android first--SharedPreferences
public class MainActivity extends Activity { private EditText et_name; private EditText et_pass; ...
- Winform MDI窗体容器,权限以及简单通讯
MDI窗体容器: 一般来说,窗体是顶级容器,不允许放在其他任何容器内,但是如果将某个窗体的IsMdiContainer属性设置为True,那此窗体就会成为窗体容器,可以在其中放入其他窗体 在内部的窗体 ...