一、直方图均衡化--equalizeHist()

 #include "opencv2/opencv.hpp"
using namespace cv; void main()
{
6 Mat srcImg = imread("E://02.jpg", 0); //以灰度方式打开,需要输入单通道图像
7 imshow("src", srcImg);
8 Mat dstImg; //均衡化后的图像
9 equalizeHist(srcImg, dstImg);
10 imshow("dst", dstImg);

//绘制src直方图
MatND dstHist; //定义存储直方图变量
int dims = ; //需要统计的特征数目(只统计灰度值)
float hranges[] = {, }; //范围[0,256)注意是最大值加1
const float* ranges[] = {hranges};
int bins = ;
int channels = ;
calcHist(&srcImg, , &channels, Mat(), dstHist, dims, &bins, ranges);
int scale = ;
Mat HistImg(bins * scale, bins*, CV_8UC3, Scalar()); //定义直方图输出图像
double minValue = ;
double maxValue = ;
minMaxLoc(dstHist, &minValue, &maxValue, , );
int hpt = saturate_cast<int>(0.9*bins); //设置最大值并防止溢出
int j=;
for(int i=; i<; i++)
{
float binValue = dstHist.at<float>(i);
int realValue = saturate_cast<int>(binValue*hpt/maxValue); //归一化数据
line(HistImg, Point(i*scale, bins-), Point(i*scale, bins-realValue), Scalar(, , ), , );
}
imshow("src_hist", HistImg); //绘制dst直方图
calcHist(&dstImg, , &channels, Mat(), dstHist, dims, &bins, ranges);
Mat HistImg2(bins * scale, bins*, CV_8UC3, Scalar()); //定义直方图输出图像
for(int i=; i<; i++)
{
float binValue = dstHist.at<float>(i);
int realValue = saturate_cast<int>(binValue*hpt/maxValue); //归一化数据
line(HistImg2, Point(i*scale, bins-), Point(i*scale, bins-realValue), Scalar(, , ), , );
}
imshow("dst_hist", HistImg2); waitKey();
}

注意:红色部分为均衡化的主要代码

彩色图像直方图均衡化

 #include "opencv2/opencv.hpp"
using namespace cv; void main()
{
Mat src = imread("E://05.jpg");
imshow("src", src); //分割通道
vector<Mat>channels;
split(src,channels);
Mat blue,green,red,dst;
blue=channels.at();
green=channels.at();
red=channels.at();
//分别对BGR通道做直方图均衡化
equalizeHist(blue,blue);
equalizeHist(green,green);
equalizeHist(red,red);
//合并通道
merge(channels,dst);
imshow("dst", dst); waitKey();
}

二、直方图对比

 #include "opencv2/opencv.hpp"
#include<iostream>
using namespace cv;
using namespace std; void main()
{
Mat src1 = imread("E://a.jpg");
Mat src2 = imread("E://b.jpg");
imshow("src1", src1);
imshow("src2", src2); MatND dstHist; //定义存储直方图变量
int dims = ; //需要统计的特征数目(只统计灰度值)
float hranges[] = {, }; //范围[0,256)注意是最大值加1
const float* ranges[] = {hranges};
int bins = ;
int channels = ;
calcHist(&src1, , &channels, Mat(), dstHist, dims, &bins, ranges);
int scale = ;
Mat HistImg(bins * scale, bins*, CV_8UC3, Scalar()); //定义直方图输出图像
double minValue = ;
double maxValue = ;
minMaxLoc(dstHist, &minValue, &maxValue, , );
int hpt = saturate_cast<int>(0.9*bins); //设置最大值并防止溢出
int j=;
for(int i=; i<; i++)
{
float binValue = dstHist.at<float>(i);
int realValue = saturate_cast<int>(binValue*hpt/maxValue); //归一化数据
line(HistImg, Point(i*scale, bins-), Point(i*scale, bins-realValue), Scalar(, , ), , );
}
imshow("src1_hist", HistImg); MatND dstHist2; //定义存储直方图变量
calcHist(&src2, , &channels, Mat(), dstHist2, dims, &bins, ranges);
Mat HistImg2(bins * scale, bins*, CV_8UC3, Scalar()); //定义直方图输出图像
minMaxLoc(dstHist2, &minValue, &maxValue, , );
for(int i=; i<; i++)
{
float binValue = dstHist2.at<float>(i);
int realValue = saturate_cast<int>(binValue*hpt/maxValue); //归一化数据
line(HistImg2, Point(i*scale, bins-), Point(i*scale, bins-realValue), Scalar(, , ), , );
}
imshow("src2_hist", HistImg2); double matchValue0 = compareHist(dstHist, dstHist2, CV_COMP_CORREL); //值越大相似度越高
double matchValue1 = compareHist(dstHist, dstHist2, CV_COMP_CHISQR); //值越小相似度越高
double matchValue2 = compareHist(dstHist, dstHist2, CV_COMP_INTERSECT); //值越大相似度越高
double matchValue3 = compareHist(dstHist, dstHist2, CV_COMP_BHATTACHARYYA); //值越小相似度越高 cout<<"matchValue0(max_best)="<<matchValue0<<endl;
cout<<"matchValue1(min_best)="<<matchValue1<<endl;
cout<<"matchValue2(max_best)="<<matchValue2<<endl;
cout<<"matchValue3(min_best)="<<matchValue3<<endl; waitKey();
}

三、反向投影

 #include "opencv2/opencv.hpp"
using namespace cv; #define WINDOW_NAME "【原始图】"
Mat g_hueImage;
int g_bins = ;//直方图组距 void on_BinChange(int, void* )
{
MatND hist;
int histSize = MAX( g_bins, );
float hue_range[] = { , };
const float* ranges = { hue_range };
calcHist( &g_hueImage, , , Mat(), hist, , &histSize, &ranges, true, false );
normalize( hist, hist, , , NORM_MINMAX, -, Mat() ); MatND backproj;
calcBackProject( &g_hueImage, , , hist, backproj, &ranges, , true );
imshow( "反向投影图", backproj ); int w = ; int h = ;
int bin_w = cvRound( (double) w / histSize );
Mat histImg = Mat::zeros( w, h, CV_8UC3 );
for( int i = ; i < g_bins; i ++ )
{
rectangle( histImg, Point( i*bin_w, h ), Point( (i+)*bin_w, h - cvRound( hist.at<float>(i)*h/255.0 ) ), Scalar( , , ), - );
}
imshow( "直方图", histImg );
} void main()
{
Mat g_srcImage = imread( "E://1.jpg" );
Mat g_hsvImage;
resize(g_srcImage, g_srcImage, Size(g_srcImage.cols/, g_srcImage.rows/));//原图太大,进行缩放
cvtColor( g_srcImage, g_hsvImage, CV_BGR2HSV ); g_hueImage.create( g_hsvImage.size(), g_hsvImage.depth() );
int ch[ ] = { , };
mixChannels( &g_hsvImage, , &g_hueImage, , ch, );//从输入中拷贝某通道到输出中特定的通道 namedWindow( WINDOW_NAME , CV_WINDOW_AUTOSIZE );
createTrackbar("色调组距 ", WINDOW_NAME , &g_bins, , on_BinChange );
on_BinChange(, ); imshow( WINDOW_NAME , g_srcImage );
waitKey();
}

opencv学习之路(20)、直方图应用的更多相关文章

  1. opencv学习之路(19)、直方图

    一.概述 二.一维灰度直方图 #include "opencv2/opencv.hpp" #include<iostream> using namespace cv; ...

  2. opencv学习之路(41)、人脸识别

    一.人脸检测并采集个人图像 //take_photo.cpp #include<opencv2/opencv.hpp> using namespace cv; using namespac ...

  3. opencv学习之路(29)、轮廓查找与绘制(八)——轮廓特征属性及应用

    一.简介 HSV颜色空间(hue色调,saturation饱和度,value亮度) 二.HSV滑动条 #include "opencv2/opencv.hpp" #include ...

  4. opencv学习之路(11)、图像几何变换

    一.图像缩放 #include<opencv2/opencv.hpp> using namespace cv; void main(){ Mat src=imread("E:// ...

  5. opencv学习之路(10)、ROI与mask掩码

    一.ROI #include<opencv2/opencv.hpp> using namespace cv; void main(){ Mat img=imread("E://0 ...

  6. opencv学习之路(4)、Mat类介绍,基本绘图函数

    一.Mat类创建 Mat img;//创建无初始化矩阵 Mat img1(,,CV_8UC1);//200行,100列(长200,宽100) Mat img2(Size(,),CV_8UC3,Scal ...

  7. opencv学习之路(2)、读取视频,读取摄像头

    一.介绍 视频读取本质上就是读取图像,因为视频是由一帧一帧图像组成的.1秒24帧基本就能流畅的读取视频了. ①读取视频有两种方法: A. VideoCapture cap; cap.open(“1.a ...

  8. opencv学习之路【四】——opencv文件结构介绍

    这里要感谢这篇博主的文章 部分内容转载自此 opencv在2.3版本之前 都是用的c语言实现的 而在2.3以后的版本 做了很多重大的改变 其中最主要的是用c++重写大部分结构 然后文件的结构和2.0之 ...

  9. Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练

    在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资 ...

随机推荐

  1. Spring AOP 自动创建代理

        Spring为我们提供了自动代理机制,让容器为我们自动生成代理,把我们从烦琐的配置工作中解放出来,在内部,Spring 使用BeanPostProcessor自动地完成这项工作.   1.实现 ...

  2. centos 安装python PIL模块

    转载:https://www.cnblogs.com/ccdc/p/4069112.html 1.安装 使用yum安装缺少类库: #尤其重要,否则会报错 yum install python-deve ...

  3. 1.4 flask request和session

    2019-1-4 18:13:57 越努力,越幸运! 还有121天,flask讲完,还有4天,总时长130天 还有13天就讲完了 一月争取看完!!! 永远不要高估自己! 今天学了request和ses ...

  4. 使用 intro.js 库

    使用 render() { const reducer = this.props.testReducer; return ( <React.Fragment> <button dat ...

  5. jquery 全选/取消全部

    html /*主要按钮*/ <td><input type="checkbox" id="checkAllChange" /></ ...

  6. vue 项目总结

    第一次参与设计前端项目 项目接近尾声,抽出时间写一下总结 项目用到技术 vue vue-cli (代理配置) element-ui axios router 技术应用思路 vue 组件封装---技术点 ...

  7. Access无法启动应用程序,工作组信息文件丢失,或是已被其他用户已独占方式打开

    使用SQL Server导入有密码的Access数据库内容,连接时出现错误提示: Access无法启动应用程序,工作组信息文件丢失,或是已被其他用户已独占方式打开 参考百度信息,可以点上图中的高级,在 ...

  8. HR在ERP实施过程中的作用

    ERP实施涉及到部门职责.个人职责的改变,在实施过程中HR有着不可估量的作用: 实施制度设计 包括如何对实施人员的激励,对实施人员进行合理的岗位职责调整: 某些企业在实施ERP时自项目经理到关键用户都 ...

  9. day15 十五、模块、from导入、起别名

    一.模块的概念 1.什么是模块:一系列功能的集合体 2.定义模块:创建一个py文件就是一个模块,该py文件名就是模块名 模块的四种存在方式 使用python编写的.py文件 包:一堆py文件的集合体 ...

  10. 树状数组 || 线段树 || Luogu P5200 [USACO19JAN]Sleepy Cow Sorting

    题面:P5200 [USACO19JAN]Sleepy Cow Sorting 题解: 最小操作次数(记为k)即为将序列倒着找第一个P[i]>P[i+1]的下标,然后将序列分成三部分:前缀部分( ...