openCV 图像直方图
来源:互联网 发布:瞎子龙年限定皮肤淘宝 编辑:程序博客网 时间:2024/04/30 10:26
思路流程:
1.获取图像
2.转换成灰度图像
3.创建直方图
4.计算直方图
5.直方图归一化,每个灰度级对应的值为概率值(0,1)
6.画出直方图
cvCreateImage函数(创建首地址并分配存储空间)
IplImage* cvCreateImage( CvSize size, int depth, int channels );
参数:
size 图像宽、高.
depth 图像元素的位深度,可以是下面的其中之一:
IPL_DEPTH_8U - 无符号8位整型
IPL_DEPTH_8S - 有符号8位整型
IPL_DEPTH_16U - 无符号16位整型
IPL_DEPTH_16S - 有符号16位整型
IPL_DEPTH_32S - 有符号32位整型
IPL_DEPTH_32F - 单精度浮点数
IPL_DEPTH_64F - 双精度浮点数
channels 每个元素(像素)通道数.可以是 1, 2, 3 或 4.通道是交叉存取的,例如通常的彩色图像数据排列是:b0 g0 r0 b1 g1 r1 ... 虽然通常 IPL 图象格式可以存贮非交叉存取的图像,并且一些OpenCV 也能处理他, 但是这个函数只能创建交叉存取图像.
cvCvtColor函数(颜色空间转换函数)
实现RGB颜色向HSV,HSI等颜色空间的转换,也可以转换为灰度图像
void cvCvtColor( const CvArr* src, CvArr* dst, int code );
参数:
src 输入的 8-bit,16-bit或 32-bit单倍精度浮点数影像
dst 输出的8-bit, 16-bit或 32-bit单倍精度浮点数影像
code 色彩空间转换的模式,该code来实现不同类型的颜色空间转换。
CV_BGR2GRAY表示转换为灰度图,
CV_BGR2HSV将图片从RGB空间转换为HSV空间
CV_BGR2GRAY时,dst需要是单通道图片
CV_BGR2HSV时,对于8位图,需要将RGB值归一化到0-1之间,这样得到HSV图中的H范围才是0-360,S和V的范围是0-1
cvCreateHist函数(创建直方图)
CvHistogram* cvCreateHist( int dims, int* sizes, int type, float** ranges=NULL, int uniform=1 );
参数:
dims 直方图维数的数目
sizes 直方图维数尺寸的数组
type 直方图的表示格式:
CV_HIST_ARRAY 意味着直方图数据表示为多维密集数组 CvMatND;
CV_HIST_TREE 意味着直方图数据表示为多维稀疏数组 CvSparseMat
ranges 图中方块范围的数组. 它的内容取决于参数 uniform 的值。
这个范围的用处是确定何时计算直方图或决定反向映射(backprojected ),
每个方块对应于输入图像的哪个/哪组值
uniform 归一化标识
cvCalcHist函数(计算图像image(s) 的直方图)
void cvCalcHist( IplImage** image, CvHistogram* hist, int accumulate=0, const CvArr* mask=NULL );
参数:
image 输入图像s (虽然也可以使用 CvMat** ).
hist 直方图指针
accumulate 累计标识。如果设置,则直方图在开始时不被清零。这个特征保证可以为多个图像计算一个单独的直方图,或者在线更新直方图。
mask 操作 mask, 确定输入图像的哪个象素被计数
NormalizeHist函数(归一化直方图)
函数 cvNormalizeHist 通过缩放来归一化直方块,使得所有块的和等于 factor
void cvNormalizeHist( CvHistogram* hist, double factor );
参数:
hist 直方图的指针
factor 归一化因子
cvQueryHistValue_1D函数(询问指定直方块的值)======>归一化后为概率值(0,1)
#define cvQueryHistValue_1D( hist, idx0 ) cvGetReal1D( (hist)->bins, (idx0) )
cvGetReal1D函数(返回单通道数组的指定元素)
double cvGetReal1D( const CvArr* arr, int idx0 );
参数:
arr 输入数组,必须是单通道.
idx0 元素下标的第一个成员,以0为基准
cvRound函数(对一个double型的数进行四舍五入,并返回一个整型数)
int cvRound (double value)
函数 cvRound, cvFloor, cvCeil 用一种舍入方法将输入浮点数转换成整数。
cvRound 返回和参数最接近的整数值
cvFloor 返回不大于参数的最大整数值
cvCeil 返回不小于参数的最小整数值
源代码:
#include <cv.h>#include <highgui.h>#include <stdio.h>int main( ){IplImage * src= cvLoadImage("lena.jpg");IplImage* gray_plane = cvCreateImage(cvGetSize(src),8,1);//创建灰度图像空间cvCvtColor(src,gray_plane,CV_BGR2GRAY);//将彩色图转换成灰度图像int hist_size = 256; //直方图尺寸int hist_height = 256;float range[] = {0,255}; //灰度级的范围float* ranges[]={range};//创建一维直方图,统计图像在[0 255]像素的均匀分布CvHistogram* gray_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);//计算灰度图像的一维直方图cvCalcHist(&gray_plane,gray_hist,0,0);//归一化直方图cvNormalizeHist(gray_hist,1.0);int scale = 2;//创建一张一维显示直方图的图,横坐标为灰度级,纵坐标为像素个数(*scale)IplImage* hist_image = cvCreateImage(cvSize(hist_size*scale,hist_height),8,3);cvZero(hist_image);//统计直方图中的最大直方块float max_value = 0;cvGetMinMaxHistValue(gray_hist, 0,&max_value,0,0);//分别将每个直方块的值绘制到图中for(int i=0;i<hist_size;i++){float bin_val = cvQueryHistValue_1D(gray_hist,i); //像素i的概率int intensity = cvRound(bin_val*hist_height/max_value); //要绘制的高度,最大值为参考,cvRectangle(hist_image,cvPoint(i*scale,hist_height-1),cvPoint((i+1)*scale - 1, hist_height - intensity),CV_RGB(0,0,255)); }cvNamedWindow( "GraySource", 1 );cvShowImage("GraySource",gray_plane);cvNamedWindow( "H-S Histogram", 1 );cvShowImage( "H-S Histogram", hist_image );cvWaitKey(0);}
效果显示:
0 0
- opencv 彩色图像直方图
- opencv二维图像直方图
- opencv 绘制图像直方图
- openCV 图像直方图
- opencv 图像直方图 calcHist
- opencv图像直方图
- opencv 图像直方图绘制
- opencv 图像直方图匹配
- opencv之图像直方图
- opencv 图像直方图
- OpenCV-统计图像的直方图,绘制直方图
- OpenCV直方图图像增强算法
- opencv——图像直方图
- OpenCV提取图像颜色直方图
- 【OpenCV】绘制图像的直方图
- 【Opencv】用直方图统计图像
- opencv直方图均衡化图像
- 【OpenCV】OpenCV1.0图像直方图
- OCP-1Z0-051 补充题库 第11题 SQL和SQL*Plus的区别
- C++ Primer 指针
- VIM常用命令总结
- JavaScript权威指南第09章 类和模块
- csdn英雄会hero 题解之-3+1
- openCV 图像直方图
- Node.js 学习一
- 系统分析与设计——部署图画法
- JAVA String.format 方法使用介绍
- 黑马程序员-day05-面向对象(基本概念)
- 有意义有意义有意义有意义一条
- 免输入密码登陆Linux的两种方法
- iOS安全攻防(二十四):敏感逻辑的保护方案(1)
- sqoop 使用指定条件导入数据