opencv学习之路(20)、直方图应用
一、直方图均衡化--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)、直方图应用的更多相关文章
- opencv学习之路(19)、直方图
一.概述 二.一维灰度直方图 #include "opencv2/opencv.hpp" #include<iostream> using namespace cv; ...
- opencv学习之路(41)、人脸识别
一.人脸检测并采集个人图像 //take_photo.cpp #include<opencv2/opencv.hpp> using namespace cv; using namespac ...
- opencv学习之路(29)、轮廓查找与绘制(八)——轮廓特征属性及应用
一.简介 HSV颜色空间(hue色调,saturation饱和度,value亮度) 二.HSV滑动条 #include "opencv2/opencv.hpp" #include ...
- opencv学习之路(11)、图像几何变换
一.图像缩放 #include<opencv2/opencv.hpp> using namespace cv; void main(){ Mat src=imread("E:// ...
- opencv学习之路(10)、ROI与mask掩码
一.ROI #include<opencv2/opencv.hpp> using namespace cv; void main(){ Mat img=imread("E://0 ...
- opencv学习之路(4)、Mat类介绍,基本绘图函数
一.Mat类创建 Mat img;//创建无初始化矩阵 Mat img1(,,CV_8UC1);//200行,100列(长200,宽100) Mat img2(Size(,),CV_8UC3,Scal ...
- opencv学习之路(2)、读取视频,读取摄像头
一.介绍 视频读取本质上就是读取图像,因为视频是由一帧一帧图像组成的.1秒24帧基本就能流畅的读取视频了. ①读取视频有两种方法: A. VideoCapture cap; cap.open(“1.a ...
- opencv学习之路【四】——opencv文件结构介绍
这里要感谢这篇博主的文章 部分内容转载自此 opencv在2.3版本之前 都是用的c语言实现的 而在2.3以后的版本 做了很多重大的改变 其中最主要的是用c++重写大部分结构 然后文件的结构和2.0之 ...
- Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练
在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资 ...
随机推荐
- Mysql order by与limit混用陷阱
在Mysql中我们常常用order by来进行排序,使用limit来进行分页,当需要先排序后分页时我们往往使用类似的写法select * from 表名 order by 排序字段 limt M,N. ...
- poj3278_kuagnbin带你飞专题一
Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 88247 Accepted: 27640 ...
- thymeleaf(二)
项目demo http://pan.baidu.com/s/1wg6PC 学习资料网址 http://www.blogjava.net/bjwulin/archive/2013/02/07/ ...
- 13 form表单
form表单中可包括 <input > 类型包括 text(name,value) password(name,value) checkbox(name,value) radio(chec ...
- django cookies与session
1. cookiies # cookies def login(request): print('COOKIES',request.COOKIES) print('SESSION',request.s ...
- Intellij IDEA 生成返回值对象快捷键
在编写一行JAVA语句时,有返回值的方法已经决定了返回对象的类型和泛型类型,我们只需要给这个对象起个名字就行. 如果使用快捷键生成这个返回值,我们就可以减少不必要的打字和思考,专注于过程的实现. 步骤 ...
- ClientImageViewController
package com.vcredit.ddcash.server.web.controller.common; import com.vcredit.ddcash.server.commons.mo ...
- ASP返回JQuery EasyUI树形要求的JSON格式
根据http://blog.csdn.net/apollokk/article/details/41382479中提供的数据将结果格式化为JQuery EasyUI树形要求的JSON格式 <% ...
- 使用阿里云公网ip建立bind,监听客户端连接失败
bind: Cannot assign requested address 网上的众多答案不能解决我的问题 通过ping可以ping通,但是 使用bind代码,这个ip就是不能用的, 使用 ifcon ...
- python-----函数参数类型
#函数参数类型:1 位置参数 2 默认参数 3 关键字参数 4可变参数 包裹位置参数*args 包裹关键字参数 **kargs#参数位置顺序:先位置参数,默认参数,包裹位置,包裹关键字(定义和调用都应 ...