OpenCV成长之路:图像直方图的应用

2014-04-11 13:57:03

标签:opencv 图像 直方图

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ronny.blog.51cto.com/8801997/1394118

正如第4篇文章所说的图像直方图在特征提取方面有着很重要的作用,本文将举两个实际工程中非常实用的例子来说明图像直方图的应用。

一、直方图的反向映射。

我们以人脸检测举例,在人脸检测中,我们第一步往往需要先提取图像中皮肤区域来缩小人脸的检测范围,这一般获得皮肤的颜色范围还需要定义阈值并不断的调整,实际中参数太多而不容易控制。

这里我们就可以考虑用直方图的反射映射。

1,收集人脸皮肤样本。

2,拼合样本并计算其颜色直方图。

3,将得到的样本颜色直方图反射映射到待检测的图片中,然后进行阈值化即可。

这里为了简单起见,我们只用两张人脸样本,实际中可以进一步扩展。

在提取样本皮肤的直方图时,我们需要对这些样本图像做一些处理,比如把头发、眼睛等部位去除,我们这里使用一个mask即可。

由于我们要计算彩色直方图像,为了简化色彩,我们还需要对颜色降维,相关函数在本系列文章第2篇中已经有介绍了。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

int main()

{

    Mat face=imread("../face.png");        // 样本

    Mat ImgSrc=imread("../img.png");    // 待检测的图像

    //图像降维

    colorReduce(face,face,32);

    colorReduce(ImgSrc,ImgSrc,32);

          

    // 计算颜色直方图

    const int channels[3]={0,1,2};

    const int histSize[3]={256,256,256};

    float hranges[2]={0,255};

    const float* ranges[3]={hranges,hranges,hranges};

    MatND hist;

    calcHist(&face,1,channels,Mat(),hist,3,histSize,ranges);

    // 直方图归一化

    normalize(hist,hist,1.0);

    // 直方图反向映射

    Mat result;

    calcBackProject(&ImgSrc,1,channels,hist,result,ranges,255);

    // 将结果进行阈值化

    threshold(result,result,255*(0.05),255,THRESH_BINARY);

return 0;

}

上面程序中有以下几点值得说明:

1,在作彩色图像直方图的反向映射时,一般需要对图像颜色进行降维。

2,OpenCV中提供的函数clacBackProject用于计算直方图的反向映射,其参数和计算直方图的参数大体相同。

3,threshold是一个阈值化的函数。

二、图像相似性的比较

图像相似性比较是比上面直方图映射更加实用且普通的例子,前段时间淘宝或百度推出类似搜图的功能都离不开图像相似性判断这个话题,当然本文这里面不可能去深入探讨那些解决方案的实现,只是利用OpenCV中的例程来简单的实现图片的匹配。 
下面我们来计算两幅图像之间的相似度:我们以左边一幅图像作为参考图像,是没有车辆停放时的图像,右边两幅跟左边比较计算相似性。中间一幅是有车辆停放时,右边一幅是另一个时刻没有车辆停放时。

这个例子实际可以应用在停车位上车辆检测上面:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

int main()

{

    Mat refImg=imread("../ref.png");

    Mat image1=imread("../image1.png");

    Mat image2=imread("../image2.png");

      

    ColorHistogram imgHist;

    //图像颜色降维

    refImg=imgHist.colorReduce(refImg,64);

    image1=imgHist.colorReduce(image1,64);

    image2=imgHist.colorReduce(image2,64);

    MatND refH=imgHist.getHistogram(refImg);

    MatND hist1=imgHist.getHistogram(image1);

    MatND hist2=imgHist.getHistogram(image2);

    double dist1,dist2;

    dist1=compareHist(refH,hist1,CV_COMP_BHATTACHARYYA);

    dist2=compareHist(refH,hist2,CV_COMP_BHATTACHARYYA);

    std::cout<<"dist1="<<dist1<<",dist2="<<dist2<<std::endl;

    return 0;

}

最终输出结果为:

dist1=0.69

dist2=0.08

上面程序中有以下几点值得说明:

1,程序中ColorHistogram是自定义的一个类,其中包括了直方图求取与图像的颜色降维,

2,直方图的比较函数为compareHist(refH,imgH,CV_COMP_XX),最后一个参数是两个矢量间距离计算的方法。

本文出自 “Ronny的成长之路” 博客,请务必保留此出处http://ronny.blog.51cto.com/8801997/1394118

时间: 2024-08-06 08:27:38

OpenCV成长之路:图像直方图的应用的相关文章

OpenCV成长之路:图像直方图

http://ronny.blog.51cto.com/8801997/1394115 2014-04-11 13:47:27 标签:opencv 直方图 统计表 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ronny.blog.51cto.com/8801997/1394115 一.图像直方图的概念 图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的.纵坐标代表了每一种

OpenCV入门教程之四 图像直方图

一.图像直方图的概念 图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的.纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比. 图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征.在实际工程中,图像直方图在特征提取.图像匹配等方面都有很好的应用.  二.利用OpenCV计算图像的直方图 OpenCV中计算图像直方图像函数是calcHist,它的参数比较多,下面分析一下它的接口和用法. void calc

OpenCV入门教程之五 图像直方图的应用

正如第4篇文章所说的图像直方图在特征提取方面有着很重要的作用,本文将举两个实际工程中非常实用的例子来说明图像直方图的应用. 一.直方图的反向映射 我们以人脸检测举例,在人脸检测中,我们第一步往往需要先提取图像中皮肤区域来缩小人脸的检测范围,这一般获得皮肤的颜色范围还需要定义阈值并不断的调整,实际中参数太多而不容易控制. 这里我们就可以考虑用直方图的反射映射. 1,收集人脸皮肤样本. 2,拼合样本并计算其颜色直方图. 3,将得到的样本颜色直方图反射映射到待检测的图片中,然后进行阈值化即可. 这里为

OpenCV成长之路:直线、轮廓的提取与描述

http://ronny.blog.51cto.com/8801997/1394139 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ronny.blog.51cto.com/8801997/1394139 基于内容的图像分析的重点是提取出图像中具有代表性的特征,而线条.轮廓.块往往是最能体现特征的几个元素,这篇文章就针对于这几个重要的图像特征,研究它们在OpenCV中的用法,以及做一些简单的基础应用. 一.Canny检测轮

OpenCV 学习(计算图像的直方图)

OpenCV 计算图像的直方图 计算图像的直方图是图像处理领域一个非常常见的基本操作. OpenCV 中提供了 calcHist 函数来计算图像直方图.不过这个函数说实话挺难用的,研究了好久才掌握了些基本的用法. calcHist 函数 C++ 的函数原型如下: void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, SparseMat& hist, int dims, const i

图像直方图均衡化增强opencv与C语言版

本文实现彩色图像的全局直方图均衡.分别对R/G/B三通道均衡,读写图片采用OpenCV.代码如下: #include <opencv2/opencv.hpp> //#include <cv.h> //#include <cxcore.h> //#include <highgui.h> #include <time.h> #include <stdio.h> #include <math.h> #include "

在python3下使用OpenCV 抓取摄像头图像并实时显示3色直方图

以下代码为在Python3环境下利用OpenCV 抓取摄像头的实时图像, 通过OpenCV的 calHist函数计算直方图, 并显示在3个不同窗口中. import cv2 import numpy as np from matplotlib import pyplot as plt import time cap  = cv2.VideoCapture(0) for i in range(0, 19):     print(cap.get(i)) while(1):     ret, fram

opencv图像直方图均衡化及其原理

直方图均衡化是什么有什么用 先说什么是直方图均衡化,通俗的说,以灰度图为例,原图的某一个像素为x,经过某个函数变为y.形成新的图.新的图的灰度值的分布是均匀的,这个过程就叫直方图均衡化. 图像直方图均衡化作用:用来增强对比度. 这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候.通过这种方法,亮度可以更好地在直方图上分布.这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能. 这种方法对于背景和前景都太亮或者太

opencv python:图像直方图 histogram

直接用matplotlib画出直方图 def plot_demo(image): plt.hist(image.ravel(), 256, [0, 256]) # image.ravel()将图像展开,256为bins数量,[0, 256]为范围 plt.show() 图像直方图 def image_hist(image): color = ('blue', 'green', 'red') for i, color in enumerate(color): # 计算出直方图,calcHist(i