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算法的原理很多资 ...
随机推荐
- Nestjs 获取cookie
Docs yarn add cookie-parser main.ts import { NestFactory } from '@nestjs/core'; import { AppModule } ...
- python 中的 list dict 与 set 的关系
转自: http://www.cnblogs.com/soaringEveryday/p/5044007.html list arraylist 实现(数组) List 通过内置的 append()方 ...
- Tomcat部署工程需注意的三点
Tomcat部署工程需注意: 1.如果该服务器是第一安装Tomcat,则各位大人应将该Tomcat的解压文件夹 backup 一份,已被不时之用.2.部署时应当注意修改Tomcat安装目录中conf文 ...
- MySQL数据库导出
因为业务需要,把MySQL查询的数据导出成csv文件,操作在Navicat中完成. 首选用SELECT语句查询数据,然后Navicat的导出,然后选csv,选路径,再加上首栏就可以了
- 选择结构的三角关系Switch、Case、Default!!!
选择结构的三角关系Switch.Case.Default!!! 今天我们学习选择结构进化章节——Switch结构,他与if有什么区别呢? 相同点: 都是用来处理多分支条件的结构 不同点: switch ...
- 我了解到的新知识之--GDPR
2018年5月25日GDPR正式实施,但是一直也是一知半解,今天偶然翻看到一篇企业撰写的关于GDPR的公众号文章,随即去网络上搜索了以下. 大家可以参考如下链接连接过于GDPR的细节,GDPR包括序言 ...
- Codeforces 570E - Pig and Palindromes - [滚动优化DP]
题目链接:https://codeforces.com/problemset/problem/570/E 题意: 给出 $n \times m$ 的网格,每一格上有一个小写字母,现在从 $(1,1)$ ...
- gcc update in centos to 6.3 by scl
CentOS 7虽然已经出了很多年了,但依然会有很多人选择安装CentOS 6,CentOS 6有些依赖包和软件都比较老旧,如今天的主角gcc编译器,CentOS 6的gcc版本为4.4,CentOS ...
- Vue.filter 过滤器
[过滤器] import Vue from '../../../node_modules/vue/dist/vue'; // 后台数据与前端展示数据需要换算,与后台交互的请求的参数是不需要.假如说前端 ...
- python之以字符串形式导入模块
示例 调用方法 class CorsMiddleware: def process(self): print('from auth.cors.CorsMiddleware.process') cors ...