OPENCV图像直方图显示(代码)
来源:互联网 发布:吐槽王pi知乎 编辑:程序博客网 时间:2024/05/18 13:46
#if !defined HISTOGRAM1D
#define HISTOGRAM1D
#pragma once
//在文件头加入“#pragma once”,能够保证头文件被编译一次,它用来防止某个头文件被多次“include”
//#if !defined, #define, #endif 用来防止某个宏被多次定义
#include "iostream"
#include "math.h"
#include "stdio.h"
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/core/core.hpp"
using namespace cv;
using namespace std;
//创建灰度图像直方图
class Histogram1D
{
public:
//构造函数
Histogram1D(){
//默认参数
histSize[0]=255;//255个箱子数
hranges[0]=0.0;//从0开始
hranges[1]=256.0;//不包括256,到255
ranges[0]=hranges;
channels[0]=0; //先关注通道0
}
//计算一维直方图
Mat getHistogram(const Mat &image){
Mat hist;
calcHist(&image, //输入图像
1, //仅仅为一个图像的直方图
channels, //使用的通道
Mat(), //不使用掩码
hist, //结果直方图
1, //直方图维数,一维
histSize, //箱子数目
ranges); //像素范围
return hist;
}
//计算一维直方图,并返回对应的图像
Mat getHistogramImage(const Mat &image,int zoom=1){
//首先计算直方图
Mat hist=getHistogram(image);
//创建图像
return getImageOfHistogram(hist,zoom);
}
//创建一个静态的直方图图像(静态方式)
static Mat getImageOfHistogram(const Mat &hist,int zoom){
//获取最大值与最小值
double maxValue=0;
double minValue=0;
minMaxLoc(hist,&minValue,&maxValue,0,0);//局部最大最小获取方式
//直方图大小
int histSize=hist.rows;
//显示直方图的方形图像
Mat histImg(histSize*zoom,histSize*zoom,CV_8UC1,Scalar(255));//初始化直方图背景区域
//设置最高的为90%(图像高度)的箱子个数
int hpt=static_cast<int>(0.9*histSize);
//为每个箱子画垂线
for (int h=0;h<histSize;h++)
{
float binValue=hist.at<float>(h);//获取一维数组hist中的数值
if (binValue>0)
{
int intensity=static_cast<int>(binValue*hpt/maxValue);//把所有数值归化到hpt一下范围
line(histImg, // 画图背景图像
Point(h*zoom,histSize*zoom), //前一个点
Point(h*zoom,(histSize-intensity)*zoom), //后一个点
Scalar(0), //颜色
zoom); //线粗
}
}
return histImg;
}
protected:
private:
int histSize[1];//直方图箱子数量
float hranges[2]; //值的范围
const float *ranges[1]; //值范围指针
int channels[1]; //要检查的通道数
};
#define HISTOGRAM1D
#pragma once
//在文件头加入“#pragma once”,能够保证头文件被编译一次,它用来防止某个头文件被多次“include”
//#if !defined, #define, #endif 用来防止某个宏被多次定义
#include "iostream"
#include "math.h"
#include "stdio.h"
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/core/core.hpp"
using namespace cv;
using namespace std;
//创建灰度图像直方图
class Histogram1D
{
public:
//构造函数
Histogram1D(){
//默认参数
histSize[0]=255;//255个箱子数
hranges[0]=0.0;//从0开始
hranges[1]=256.0;//不包括256,到255
ranges[0]=hranges;
channels[0]=0; //先关注通道0
}
//计算一维直方图
Mat getHistogram(const Mat &image){
Mat hist;
calcHist(&image, //输入图像
1, //仅仅为一个图像的直方图
channels, //使用的通道
Mat(), //不使用掩码
hist, //结果直方图
1, //直方图维数,一维
histSize, //箱子数目
ranges); //像素范围
return hist;
}
//计算一维直方图,并返回对应的图像
Mat getHistogramImage(const Mat &image,int zoom=1){
//首先计算直方图
Mat hist=getHistogram(image);
//创建图像
return getImageOfHistogram(hist,zoom);
}
//创建一个静态的直方图图像(静态方式)
static Mat getImageOfHistogram(const Mat &hist,int zoom){
//获取最大值与最小值
double maxValue=0;
double minValue=0;
minMaxLoc(hist,&minValue,&maxValue,0,0);//局部最大最小获取方式
//直方图大小
int histSize=hist.rows;
//显示直方图的方形图像
Mat histImg(histSize*zoom,histSize*zoom,CV_8UC1,Scalar(255));//初始化直方图背景区域
//设置最高的为90%(图像高度)的箱子个数
int hpt=static_cast<int>(0.9*histSize);
//为每个箱子画垂线
for (int h=0;h<histSize;h++)
{
float binValue=hist.at<float>(h);//获取一维数组hist中的数值
if (binValue>0)
{
int intensity=static_cast<int>(binValue*hpt/maxValue);//把所有数值归化到hpt一下范围
line(histImg, // 画图背景图像
Point(h*zoom,histSize*zoom), //前一个点
Point(h*zoom,(histSize-intensity)*zoom), //后一个点
Scalar(0), //颜色
zoom); //线粗
}
}
return histImg;
}
protected:
private:
int histSize[1];//直方图箱子数量
float hranges[2]; //值的范围
const float *ranges[1]; //值范围指针
int channels[1]; //要检查的通道数
};
#endif;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "Histogram1D.h"
void main(){
Histogram1D h;
Mat image=imread("C:\\Users\\Administrator\\Desktop\\experiment\\d120.jpg",CV_LOAD_IMAGE_GRAYSCALE);
imshow("result",h.getHistogramImage(image));
waitKey(0);
}
阅读全文
0 0
- OPENCV图像直方图显示(代码)
- 彩色图像直方图均衡化及颜色直方图显示 opencv实现 完整代码及详细注释
- 彩色图像直方图均衡化及颜色直方图显示 opencv实现 完整代码及详细注释
- OpenCV计算和显示图像直方图
- OpenCV-007:图像直方图的显示
- OpenCV 学习(计算图像的直方图)
- opencv获取彩色(RGB)图像直方图
- opencv 彩色图像直方图
- opencv二维图像直方图
- opencv 绘制图像直方图
- openCV 图像直方图
- opencv 图像直方图 calcHist
- opencv图像直方图
- opencv 图像直方图绘制
- opencv 图像直方图匹配
- opencv之图像直方图
- opencv 图像直方图
- OpenCV学习笔记(2)之图像通道分离和RGB三通道直方图显示
- NOIP2004提高组-虫食算
- IP地址、子网掩码、有效子网数、有效主机数
- JS三种函数定义
- Tomcat基础认知
- 图像特效之径向滤波
- OPENCV图像直方图显示(代码)
- POJ2118-Firepersons
- Deepin Linux 安装JDK
- Resource Manager HA配置
- javaee学习日记之java基础之I/O流
- LintCode 376: Binary Tree Path Sum
- ThinkPHP5.0 控制器继承基类和自定义类
- Android存在的三种活动启动模式
- Kali 安装 Oracle jdk