第11集 一维直方图

1.把彩***像分成3个图像(cvSplit)

2.创建直方图并且分配内存(CvHistogram* hist=cvCreateHist)

3.读取图像的直方图,把数据存放在直方图结构体中(cvCapcHist)

4.读取直方图结构体中每个值的点数(cvQueryHistValue_1D)

5.描点,画图(cvPoint,cvFillConvexPoly)

直方图的其它操作:

1.cvNorMalizeHist(CvHistogram* hist,double factor)

归一化直方图,factor表示直方图归一化后的数字

2.cvThreshHist(CvHistogram* hist,double factor);

factor是一个开关阀值,小于该阀值的各个bin的值都被设为0

3.void cvCopyHist(const CvHistogram* src,CvHistogram** dst);

复制一个直方图的信息到另一个直方图,如果设置*dst为NULL,那么生成一个与src一样大小的新直方图,*dst被分配给一个指向新分配的直方图的指针

4.cvGetMinMaxHistValue(const CvHistogram* hist,float* min_value,float* max_value,int min_idx=NULL,int max_idx=NULL)

求直方图hist中的最小最大值及其索引

5.cvCalcHist(IplImage** image,CvHistogram* hist,int accumulate=0,const CvArr* mask=NULL);

从图像中自动计算直方图,图像要转换为单通道图像,accumulate如果非零,表示直方图hist在读入图像之前没有被清零,允许cvCalcHist()在一个数据采集循环中被多次调用,mask如果非零,则只有与mask非零元素对应

6.double cvCompareHist(const CvHistogram* hist1,const CvHistogram*  hist2,int method)

比较两个大小相同的直方图的相似度

程序1(自己):

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
IplImage* cvDrawHist(IplImage *image,int x=1,int y=1)
{
int dim=1;
int size=256;
float range[]={0,255};
float *ranges[]={range};  //数组的个数等于维数,这里是一维
CvHistogram *hist=cvCreateHist(dim,&size,CV_HIST_ARRAY,ranges,1);
cvClearHist(hist);
cvCalcHist(&image,hist);
float max=0;
cvGetMinMaxHistValue(hist,NULL,&max);
IplImage *HistImage=cvCreateImage(cvSize(256*x,64*y),8,1);
cvZero(HistImage);
CvPoint pts[5];
for(int i=0;i<255;i++)
{
float num=cvQueryHistValue_1D(hist,i);
float nextnum=cvQueryHistValue_1D(hist,i+1);
pts[0]=cvPoint(i*x,0);
pts[1]=cvPoint((i+1)*x,0);
pts[2]=cvPoint((i+1)*x,64*y-nextnum/max*64*y);
pts[3]=cvPoint(i*x,64*y-num/max*64*y);
pts[4]=cvPoint(i*x,0);
cvFillConvexPoly(HistImage,pts,5,cvScalar(255));
}
return HistImage;
}
void main()
{
IplImage *src=cvLoadImage("c:\\1.jpg");
cvNamedWindow("src");
cvShowImage("src",src);
IplImage *red=cvCreateImage(cvGetSize(src),8,1);
IplImage *green=cvCreateImage(cvGetSize(src),8,1);
IplImage *blue=cvCreateImage(cvGetSize(src),8,1);
cvSplit(src,red,green,blue,NULL);
cvNamedWindow("red");
cvNamedWindow("green");
cvNamedWindow("blue");
cvShowImage("red",red);
cvShowImage("green",green);
cvShowImage("blue",blue);
IplImage *r_hist=cvDrawHist(red);
IplImage *b_hist=cvDrawHist(blue);
IplImage *g_hist=cvDrawHist(blue);
cvNamedWindow("r_hist");
cvNamedWindow("g_hist");
cvNamedWindow("b_hist");
cvShowImage("r_hist",r_hist);
cvShowImage("g_hist",b_hist);
cvShowImage("b_hist",g_hist);
cvWaitKey(0);
cvDestroyWindow("red");
cvReleaseImage(&red);
cvDestroyWindow("green");
cvReleaseImage(&green);
cvDestroyWindow("blue");
cvReleaseImage(&blue);
cvDestroyWindow("r_hist");
cvReleaseImage(&r_hist);
cvDestroyWindow("g_hist");
cvReleaseImage(&g_hist);
cvDestroyWindow("b_hist");
cvReleaseImage(&b_hist);
}

程序2:

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
//绘制直方图
IplImage* DrawHistogram(CvHistogram* hist , float scaleX = 1 , float scaleY = 1)
{
        //获取直方图中极大值
        float histMax = 0;
        cvGetMinMaxHistValue(hist , 0 ,&histMax ,0 ,0);
        //创建图像 该图像用于显示直方图
        IplImage* imgHist = cvCreateImage(cvSize(256*scaleX , 64*scaleY) , 8 ,1);
        //图像置零
        cvZero(imgHist);
        //依次绘制直方图的bin
        for(int i=0;i<255;i++)
        {
                //获取直方图的值
                float histValue = cvQueryHistValue_1D(hist , i);
                float nextValue = cvQueryHistValue_1D(hist , i+1);
                //获取四边形的四个点的坐标  详情请观看视频的讲解
                CvPoint pt1 = cvPoint(      i*scaleX , 64*scaleY);
                CvPoint pt2 = cvPoint(  (i+1)*scaleX , 64*scaleY);
                CvPoint pt3 = cvPoint(  (i+1)*scaleX , (64 - (nextValue/histMax)*64) *scaleY );
                CvPoint pt4 = cvPoint (      i*scaleX , (64 - (histValue/histMax)*64) *scaleY );
                int numPts = 5;
                CvPoint pts[5];
                pts[0] = pt1;
                pts[1] = pt2;
                pts[2] = pt3;
                pts[3] = pt4;
                pts[4] = pt1;
                //填充四边形
                cvFillConvexPoly(imgHist , pts ,numPts , cvScalar(255));
        }
        return imgHist;
}
int main(int argc, char* argv[])
{
        //加载图像
        IplImage* src = cvLoadImage("c:\\1.jpg");
        
        cvNamedWindow("sr");
        cvShowImage("sr" , src);
        int dims = 1;  // 一维直方图
        int size =256; //bin的个数
        float range[] = {0,255}; //取值范围
        float* ranges[] = {range};
        CvHistogram* hist;
        //创建直方图
        hist = cvCreateHist(dims , &size , CV_HIST_ARRAY ,  ranges , 1 );
        //清空直方图
        cvClearHist(hist);
        //给B  G  R 三个通道的图像分配空间
        IplImage* imgRed = cvCreateImage(cvGetSize(src) , 8 ,1);
        IplImage* imgGreen = cvCreateImage(cvGetSize(src) , 8 ,1);
        IplImage* imgBlue = cvCreateImage(cvGetSize(src) , 8 ,1);
        //将图像src  分解成B   G   R 三个通道
        cvSplit(src , imgBlue , imgGreen , imgRed , NULL);
        //计算B通道 直方图
        cvCalcHist(&imgBlue , hist , 0 , 0 );
        //绘制B通道直方图  结果保存在histBlue
        IplImage* histBlue = DrawHistogram(hist);
        //将B通道的直方图数据清空
        cvClearHist(hist);
        //计算G通道直方图
        cvCalcHist(&imgGreen , hist , 0 , 0 );
        //绘制G通道直方图  histGreen
        IplImage* histGreen = DrawHistogram(hist);
        //将G通道的直方图数据清空
        cvClearHist(hist);
        //计算R通道 直方图
        cvCalcHist(&imgRed , hist , 0 , 0 );
        //绘制R通道直方图  histRed
        IplImage* histRed = DrawHistogram(hist);
        //将R通道的直方图数据清空
        cvClearHist(hist);
        cvNamedWindow("B");
        cvNamedWindow("G");
        cvNamedWindow("R");
        cvShowImage("B"  , histBlue);
        cvShowImage("G"  , histGreen);
        cvShowImage("R"  , histRed);
        cvWaitKey(0);
        //释放资源
        //(1) 释放源图像
        cvReleaseImage(&src);
        //(2) 释放三个通道的图像
        cvReleaseImage(&imgRed);
        cvReleaseImage(&imgGreen);
        cvReleaseImage(&imgBlue);
        //(3)释放三个通道直方图
        cvReleaseImage(&histBlue);
        cvReleaseImage(&histGreen);
        cvReleaseImage(&histRed);
        //(4)释放直方图空间
        cvReleaseHist(&hist);
        return 0;
}

第11集 一维直方图

时间: 2024-08-11 01:18:33

第11集 一维直方图的相关文章

图像检索:一维直方图+EMD距离

EMD距离详细介绍已经在在这里已经给出. 思路:我们把一张图像的归一化的一维直方图作为signature的权重值,把色相的值作为signature.也就是一般在比较两幅图像的EMD距离时,signature是一样,只是权重值不一样. 通过以下程序,就可以得到一幅图像的signature: #include<iostream> using namespace std; #include<opencv2\core\core.hpp> #include<opencv2\highgu

智慧解析第11集:非线性思维

智慧解析第11集:非线性思维,布布扣,bubuko.com

图像检索:一维直方图+欧几里得距离+flann+KNN

在F盘生成了一个文件名称为"文件夹"的文本文件. 第一步:批处理提取图像的一维颜色直方图,并保存到.xml中的featureHists 第一个參数:图像的路径 第二个參数:保存的.xml #include<iostream> #include<fstream> #include<string> using namespace std; #include<opencv2\imgproc\imgproc.hpp> #include<op

Centos7使用kubeadm 安装多主高可用kubernets:v.1.11集群

实验环境介绍: 本次实验环境是5个节点 3台master 2台node节点: k8smaster01 192.168.111.128 软件:etcd k8smaster haproxy keepalived k8smaster02 192.168.111.129 软件:etcd k8smaster haproxy keepalived k8smaster03 192.168.111.130 软件:etcd k8smaster haproxy keepalived k8snode01 192.16

【执行力决定命】第11集《减少沟通频次》

「音频原文」http://dwz.cn/6sB49U 大家好,我是林琳笨,今天跟大家一起分享<减少沟通频次>,这个话题是很多人不以为然,但很重要的也很考验一个人的素养和智慧. 先来分享两个故事: 你有没有在QQ或微信上收到过这样的消息? 在吗? 你打算怎么回? 我一般:熟且不太忙时会回"不在",不熟的我直接不回:不熟悉甚至不记得这个人是谁的话,过段时间我可能会把他删除. 应该怎么做呢?当然是直接进入主题:小红我需要你帮我引荐小刚给我认识,谢谢!往往越熟悉,越有素养的人,往往

罗辑思维2014 第11集 迷茫时代的明白人(慢慢来,能做一点是一点)

活在当下的意思,好像是说事情慢慢来,能做一点是一点,能拱一点是一点,既不要沉溺于过去的失败或者光荣(左宗棠),也不要太对未来痴心妄想(张之洞). 只有李鸿章是躺着也睁眼,张之洞是跑着也闭眼. 罗胖认为:借钱给别人,这种难题,其实只是未来的难题,为没有发生的事情去担心. 你不要想未来怎么样,你就利用现在的资源,做一件在现在岗位上最漂亮的事情.不要为KPI去考虑,也不要去考虑自己过去的才能. 不要为KPI去考虑,也不要去考虑自己过去的才能.因为情况变了嘛. 最好的方案,就是学习李鸿章,活在当下,就从

英语----美剧----蛇蝎女佣(Devious maids) 第二季 第11集(1)

she making grab your person you left after 20 years o marriage destorying my self-confienne and myself-esteem The one thing in the world i am sure of is that i don't have to go with you anywere eve again she a a wrom// 坏蛋 There's no point arguing abo

跟涛哥一起学嵌入式第11集:一个实现锁机制非常有意思的宏

QQ群(宅学部落)有位学员问了一个很奇怪的宏,觉得很有意思,特拿来分享,它的定义如下: 我们知道,宏定义其实就是为了方便,给一串代码字符串定义一个别名.有时候字符串过于复杂,我们可以分多行书写,然后使用逻辑连接符"\"连接起来,表示一个完整的字符串.但是分析上面的宏定义,你会发现它分别定义了2个宏,但是呢,又使用了一对大括号括起来,很有欺骗性:看起来很像语句表达式,但是呢,有没有小括号括起来,是不是很奇怪?调用的时候,使用方法更是奇怪,如果我们单独使用AA()或BB()调用,你会发现编

第11集 PLC输入与输出控制

1,PLC盒子的使用 2,路径功能文本的使用(说明输入输出点的功能,实现了属性关联):插入\路径功能文本 3,如何改变元器件默认的摆放方向? 按键Backspace选择 4,如何水平对齐元器件? 选中需要对齐的元器件\编辑\其他\均匀分布(水平) 注:但这样有一个缺点,会使部分元器件无法对齐到栅格:进一步点击即可: 5,输出回路 原文地址:https://www.cnblogs.com/csflyw/p/11429120.html