数字图像处理作业使用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 = 256;
    int hist_size[] = {bins};
    float range[] = { 0, 256 };
    const float* ranges[] = { range};
    MatND hist;
    int channels[] = {0};
//使用ocv自带函数计算灰度直方图
    calcHist( &gray, 1, channels, Mat(), // do not use mask
        hist, 1, hist_size, ranges,
        true, // the histogram is uniform
        false );

//画出直方图
    double max_val;
    minMaxLoc(hist, 0, &max_val, 0, 0);
    int scale = 2;
    int hist_height=256;
    Mat hist_img = Mat::zeros(hist_height,bins*scale, CV_8UC3);
    for(int i=0;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-1),
            Point((i+1)*scale - 1, hist_height - intensity),
            CV_RGB(255,255,255));
    }
    imshow( "Source", src );
    imshow( "Gray Histogram", hist_img );
    waitKey(10000000000);
    return 0;
}    

我需要关注的就是【画出直方图】这一块代码。

可以发现,这个直方图是将每一个区间长度定位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

时间: 2024-11-01 04:56:41

数字图像处理作业使用OpenCV - 自定义直方图的相关文章

数字图像处理作业使用OpenCV - 使用笔记

数字图像处理作业的输入图像全部都是灰度图像,所以汇总一下自己遇到的问题答案. OCV的图像容器是Mat<typename>,可以用imread(filename)读取图像,filename是c string,char*和const char*都行.灰度图像的typename是uchar,RGB图像的typename是Vec3b. Mat容器如果直接使用操作符赋值,只会复制一份信息头而不会复制包含数据的矩阵,由此而降低内存的浪费和速度,所以这样得到的多个Mat对象都指向同一个数据矩阵,换句话说,

数字图像处理作业使用OpenCV - 配置

使用环境:Windows7 旗舰版 + vs2008 + OpenCV2.0a 基本上配置都是通过网上一个教程,在此附上地址 Click ME. 为了避免因不同版本而出现的安装问题,我还是下载了2.0版本的OCV,但是现在Win可用的最新版本都是2.4.10了,虽然2.3之后的版本都不在需要自己用CMAKE编译了,但一般网上教程都是配置的vs2010或以上版本. 至于还有搜到过vs2008配置OCV2.4.5的教程,也附上地址 Click ME,为什么不选择他是因为他没有图看着不那么清楚……比较

数字图像处理作业使用OpenCV - 块提取

今天要记录的是树图第二次作业的第二题,Image Patch Extraction.这个概念真的不难懂,但是如果要我实际写的话,还真的不知道要怎么去遍历图像矩阵来提取块.在此要多谢邓大神的热心帮助,告诉了我一个遍历的思路_(:з」∠)_ 一开始我是从原图像矩阵来考虑循环的,也就是两层循环的边界分别是原图像的width和height.这样思考的话,我完全不知道应该如何移动这个patch. 之后思考了从得到的patch列表来考虑,也就两侧循环的边界分别是W-w+1和H-h+1(W是原图像的width

python数字图像处理(9):直方图与均衡化

在图像处理中,直方图是非常重要,也是非常有用的一个处理要素. 在skimage库中对直方图的处理,是放在exposure这个模块中. 1.计算直方图 函数:skimage.exposure.histogram(image, nbins=256) 在numpy包中,也提供了一个计算直方图的函数histogram(),两者大同小义. 返回一个tuple(hist, bins_center), 前一个数组是直方图的统计量,后一个数组是每个bin的中间值 import numpy as np from

使用 matlab 数字图像处理(一)—— 归一化直方图

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net I = imread('pout.tif'); % matlab 自带图像 [cnts, x] = imhist(I, 32); [m, n] = size(I); prob = cnts / m / n; % sum(prob) == 1 stem(x, prob) 1 2 3 4 5 6 图像的灰度直方图关于图像提供了丰富的信息

OpenCV-跟我一起学数字图像处理之直方图均衡化

从这篇博文开始,小生正式从一个毫不相干专业转投数字图像处理.废话不多说了,talk is cheap. show me the code. 直方图均衡化目的 由于一些图像灰度的分布过于集中,这样会导致图像的层次不够分明,直方图均衡化就是为了让图像的灰度分布更均匀,图像的层次感更强. 数学原理 基于连续灰度分布的结论推导 直方图均衡化属于数字图像处理中灰度变换(intensity transformation)的内容,灰度变换的目的就是找到一个合适的映射函数s=T(r).将原图像的灰度值映射到新的

数字图像处理-----直方图均衡化

直方图均衡化(Histogram Equalization) 又称直方图平坦化,实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等.这样,原来直方图中间的峰顶部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较平的分段直方图:如果输出数据分段值较小的话,会产生粗略分类的视觉效果. 直方图是表示数字图像中每一灰度出现频率的统计关系.直方图能给出图像灰度范围.每个灰度的频度和灰度的分布.整幅图像的平均明暗和对比度等概貌性描述.灰度直方图是灰度级

【数字图像处理】四.MFC对话框绘制灰度直方图

本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行回忆讲解,主要通过MFC单文档视图实现点击弹出对话框绘制BMP图片的灰度直方图,再获取平均灰度.中指灰度和标准差等值.文章比较详细基础,希望该篇文章对你有所帮助~ [数字图像处理]一.MFC详解显示BMP格式图片 [数字图像处理]二.MFC单文档分割窗口显示图片 [数字图像处理]三.MFC实现图像灰度.采样和量化功能详解 免费资源下载地址: http://download.csdn.ne

【数字图像处理之(四)】用图像增强谈灰度直方图

灰度直方图 是灰度级的函数,描述的是图像中该灰度级的像个数或该灰度级像素出现的频率(归一化) 生成并绘制直方图: src = imread('Fig0303(a)(breast).tif'); imshow(src); h1 = imhist(src); %生成直方图 figure,imhist(src,255); %绘制直方图 h2 = imhist(src, 25); %生成直方图 horz = linspace(0, 255, 25); figure,bar(horz, h2); %绘制条