一、直方图均衡化--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. 下载m3u8视频

    分两种情况 同时支持m3u8和mp4文件 某些视频同时支持m3u8和mp4视频文件,将m3u8改成mp4后直接: wget -c http://www.xxx.com/xxxx.mp4 只有m3u8视 ...

  2. Centos下普通用户设置sudo权限

    若执行sudo命令的用户没有sodu权限,则会报以下错误 violet is not in the sudoers file.This incident will be reported 若想让vio ...

  3. js版的in_array的实现方法

    这是一个JS版的判断数组内的元素的方法. var arr = ['a','b','c']; console.log(in_array('b',arr)); // true function in_ar ...

  4. CF2A Winner

    题目描述: 在 Berland 流行着纸牌游戏 “Berlogging” ,这个游戏的赢家是根据以下规则确定的:在每一轮中,玩家获得或失去一定数量的分数,在游戏过程中,分数被记录在“名称和得分”行中, ...

  5. eclipse连接mysql数据库实现怎删改查操作实例(附带源码)

    package model; public class User { private int id; private String name; private String password; pub ...

  6. ERP项目实施记录10

    好久没有更新,因为进度一直拖着.已经实施了20个月了,很多东西没有开发出来.原因多方面的,虽然在此打算吐槽一下开发公司,但其实很大部分责任还是在我们自己. 不多说了,看图:

  7. vue的属性样式绑定,

    <template> <div id="app"> <div v-html="H"></div>  //绑定ht ...

  8. PAT甲级1135 Is It A Red-Black Tree?【dfs】

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805346063728640 题意: 给定一棵二叉搜索树的先序遍历结 ...

  9. C#基础加强(1)之索引器

    索引器 介绍 索引器,初学者可能听起来有些陌生,但其实我们经常会用到它,例如: // 字符串的索引器 string str = "hello world"; ]; // 获取到字符 ...

  10. [js]js设计模式小结

    js设计模式小结 工厂模式/构造函数--减少重复 - 创建对象有new - 自动创建obj,this赋值 - 无return 原型链模式 - 进一步去重 类是函数数据类型,每个函数都有prototyp ...