S0.3 直方图
直方图(一)

直方图概念
直方图是图像中像素强度分布的图形表达方式.
它统计了每一个强度值所具有的像素个数.
直方图分类
灰度直方图:边缘检测
RGB直方图:图像检索
二维直方图
直方图优点
计算代价低。
具有图像平移、缩放、旋转的不变性。
图像分割是图像识别的基础,基于灰度直方图的阈值分割计算简单,对遥感图像处理效果好。
- 直方图是计算机视觉最经典的工具之一。
直方图应用
- 图像相似度
- 灰度图像的阈值分割(将来会写一篇博客讲这个)
- 基于颜色的图像检索
- 图像分类
ps:喜欢摄影的朋友一定知道直方图可以做照片的后期处理,调出影调风格。
opencv3直方图产生函数cvCalcHist()
经过这个函数会得到一个Mat
void calcHist(
const Mat* images,
int nimages,
const int* channels,
InputArray mask,
OutputArray hist,
int dims,
const int* histSize,
const float** ranges,
bool uniform=true,
bool accumulate=false
)
const Mat* images:为输入图像的指针。
int nimages:要计算直方图的图像的个数。此函数可以为多图像求直方图,我们通常情况下都只作用于单一图像,所以通常nimages=1。
const int* channels:图像的通道,它是一个数组,如果是灰度图像则channels[1]={0};如果是彩色图像则channels[3]={0,1,2};如果是只是求彩色图像第2个通道的直方图,则channels[1]={1};
IuputArray mask:是一个遮罩图像用于确定哪些点参与计算,实际应用中是个很好的参数,默认情况我们都设置为一个空图像,即:Mat()。
OutArray hist:计算得到的直方图
int dims:得到的直方图的维数,灰度图像为1维,彩色图像为3维。
const int* histSize:直方图横坐标的区间数。如果是10,则它会横坐标分为10份,然后统计每个区间的像素点总和。
const float** ranges:这是一个二维数组,用来指出每个区间的范围。
后面两个参数都有默认值,uniform参数表明直方图是否等距,最后一个参数与多图像下直方图的显示与存储有关。
画图函数
Mat getHistImg(const MatND& hist)
{
double maxVal=0;
double minVal=0;
//找到直方图中的最大值和最小值
minMaxLoc(hist,&minVal,&maxVal,0,0);
int histSize=hist.rows;
Mat histImg(histSize,histSize,CV_8U,Scalar(255));
// 设置最大峰值为图像高度的90%
int hpt=static_cast<int>(0.9*histSize);
for(int h=0;h<histSize;h++)
{
float binVal=hist.at<float>(h);
int intensity=static_cast<int>(binVal*hpt/maxVal);
line(histImg,Point(h,histSize),Point(h,histSize-intensity),Scalar::all(0));
}
return histImg;
}
完整示例
示例
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
using namespace cv;
Mat getHistImg(const MatND& hist)
{
double maxVal=0;
double minVal=0;
//找到直方图中的最大值和最小值
minMaxLoc(hist,&minVal,&maxVal,0,0);
int histSize=hist.rows;
Mat histImg(histSize,histSize,CV_8U,Scalar(255));
// 设置最大峰值为图像高度的90%
int hpt=static_cast<int>(0.9*histSize);
for(int h=0;h<histSize;h++)
{
float binVal=hist.at<float>(h);
int intensity=static_cast<int>(binVal*hpt/maxVal);
line(histImg,Point(h,histSize),Point(h,histSize-intensity),Scalar::all(0));
}
return histImg;
}
int main()
{
Mat srcImage = imread("images/favorite/Lena.jpg");
imshow("Lena", srcImage);
cvtColor(srcImage,srcImage,CV_BGR2GRAY);
const int channels[1] = {0};
const int histSize[1] = {256};
float hranges[2]={0,255};
const float* ranges[1]={hranges};
MatND hist; //相当于mat
calcHist(&srcImage,1,channels,Mat(),hist,1,histSize,ranges);
imshow("hist", getHistImg(hist));
waitKey(10000);
return 0;
}

S0.3 直方图的更多相关文章
- S0.6 直方图均衡化
S0.6 直方图均衡化 直方图均衡化能提高图像的质量 累积直方图 这是后面均衡化所要知道的先验知识. 如果说直方图统计的是等于像素值的数量,那么累积直方图统计的就是小于等于像素值的数量 均衡化步骤 我 ...
- matlab 直方图均衡化
原理: 直方图均衡化首先是一种灰度级变换的方法: 原来的灰度范围[r0,rk]变换到[s0,sk]变换函数为:s=T(r); 为便于实现,可以用查找表(look-up table)的方式存储,即:原始 ...
- 灰度图像--图像增强 直方图均衡化(Histogram equalization)
灰度图像--图像增强 直方图均衡化(Histogram equalization) 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些 ...
- MFC绘制直方图和饼图
转载原文: Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNorma ...
- Oracle索引梳理系列(十)- 直方图使用技巧及analyze table操作对直方图统计的影响(谨慎使用)
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- 任意半径局部直方图类算法在PC中快速实现的框架。
在图像处理中,局部算法一般来说,在很大程度上会获得比全局算法更为好的效果,因为他考虑到了图像领域像素的信息,而很多局部算法可以借助于直方图获得加速.同时,一些常规的算法,比如中值滤波.最大值滤波.最小 ...
- [LeetCode] Largest Rectangle in Histogram 直方图中最大的矩形
Given n non-negative integers representing the histogram's bar height where the width of each bar is ...
- opencv 比较直方图方式 进行人脸检测对比
完整opencv(emgucv)人脸.检测.采集.识别.匹配.对比 //成对几何直方图匹配 public static string MatchHist() ...
- LeetCode: Largest Rectangle in Histogram(直方图最大面积)
http://blog.csdn.net/abcbc/article/details/8943485 具体的题目描述为: Given n non-negative integers represent ...
随机推荐
- Qt调用自己编译的libglog.a出现问题
我确定依据正确导入库后,依旧出现未定义的引用. undefined reference to _imp___ZN6google17InitGoogleLoggingEPKc 尝试过重新编译,调整编译参 ...
- Mybatis-PageHelper
pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- MongoDB 3.6.9 集群搭建 - 切片+副本集
1. 环境准备 在Mongo的官网下载Linux版本安装包,然后解压到对应的目录下:由于资源有限,我们采用Replica Sets + Sharding方式来配置高可用.结构图如下所示: 这里我说明下 ...
- 第三节:总结.Net下后端的几种请求方式(WebClient、WebRequest、HttpClient)
一. 前言 前端调用有Form表单提交,ajax提交,ajax一般是用Jquery的简化写法,在这里不再过多介绍: 后端调用大约有这些:WebCient.WebRequest.Httpclient.W ...
- 轴对称 Navier-Stokes 方程组的点态正则性准则 II
在 [Wei, Dongyi. Regularity criterion to the axially symmetric Navier-Stokes equations. J. Math. Anal ...
- 网络学习day02_OSI七层模型及数据的传输过程
title: 2018.9.2 OSI七层模型及数据的传输过程 tags: 计算机网络, OSI七层模型, 数据传输, 数据解封装 --- OSI七层模型和TCP/IP五层模型 OSI七层模型 我们说 ...
- Stm32型号查阅手册
- HTTP协议08-请求首部字段
请求首部字段 请求首部字段是从客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息.客户端信息,对响应内容相关的优先级等内容 1)Accept 通知服务器,用户代理能够处理的媒体类型及媒 ...
- installshield安装包制作
入门教程:http://blog.csdn.net/gaofang2009/article/details/5260065 入门教程:http://blog.csdn.net/plfl520/arti ...
- 结构体重载运算符&srand&rand
先上代码,再按代码讲解 #include<stdio.h>#include<string.h>#include<stdlib.h>#include<time. ...