OpenCv 020---图像直方图反向投影

1 前备知识

直方图的方向投影原理及代码实现

反向投影的直观理解

直方图反向投影的作用

2 所用到的主要OpenCv API

/** @brief 计算(一个或多个)数组的直方图

*/

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 );

/** @brief 计算一个直方图的反向投影

*/

CV_EXPORTS void calcBackProject( const Mat* images, int nimages,
                                 const int* channels, InputArray hist,
                                 OutputArray backProject, const float** ranges,
                                 double scale = 1, bool uniform = true );

3 程序代码

#include <opencv2/opencv.hpp>
#include <iostream>
#include<stdio.h>
using namespace cv;
using namespace std;

const int bins = 256;
Mat src;
const char* winTitle = "input image";
void backProjection_demo(Mat &image, Mat &model);

int main(int argc, char** argv) {
    Mat src = imread("images/target.png");
    Mat model = imread("images/sample.png");
    if (src.empty() || model.empty()) {
        printf("could not load image...\n");
        return 0;
    }
    namedWindow(winTitle, WINDOW_AUTOSIZE);
    imshow(winTitle, src);
    imshow("model", model);

    backProjection_demo(src, model);
    waitKey(0);
    return 0;
}

void backProjection_demo(Mat &image, Mat &model) {
    Mat model_hsv, image_hsv;
    cvtColor(model, model_hsv, COLOR_BGR2HSV);
    cvtColor(image, image_hsv, COLOR_BGR2HSV);

    // 定义直方图参数与属性
    int h_bins = 32; int s_bins = 32;
    int histSize[] = { h_bins, s_bins };
    // hue varies from 0 to 179, saturation from 0 to 255
    float h_ranges[] = { 0, 180 };
    float s_ranges[] = { 0, 256 };
    const float* ranges[] = { h_ranges, s_ranges };//相当于2*2
    int channels[] = { 0, 1 };
    Mat roiHist;
    calcHist(&model_hsv, 1, channels, Mat(), roiHist, 2, histSize, ranges, true, false);//计算模板图像hsv直方图
    normalize(roiHist, roiHist, 0, 255, NORM_MINMAX, -1, Mat());//归一化
    MatND backproj;
    calcBackProject(&image_hsv, 1, channels, roiHist, backproj, ranges, 1.0);//opencv反向投影计算
    imshow("BackProj", backproj);
}

4 运行结果

5 扩展及注意事项

6*目前只做大概了解,知道有这一算法,后续具体使用再做具体分析

原文地址:https://www.cnblogs.com/Vince-Wu/p/11766359.html

时间: 2024-08-05 08:01:39

OpenCv 020---图像直方图反向投影的相关文章

OpenCV2马拉松第10圈——直方图反向投影(back project)

收入囊中 灰度图像的反向投影 彩色图像的反向投影 利用反向投影做object detect 葵花宝典 什么是反向投影?事实上没有那么高大上! 在上一篇博文学到,图像能够获得自己的灰度直方图. 反向投影差点儿相同是逆过程,由直方图得到我们的投影图. 步骤例如以下: 依据模版图像,得到模版图像的灰度直方图. 对灰度直方图对归一化,归一化后是个概率分布,直方图的积分是1 依据概率分布的直方图,求输入图像的投影图,也就是对每个像素点,我们依据灰度值,能够得到其概率 得到的投影图是介于[0,1]之间的,为

OpenCV2马拉松第11圈——meanshift与直方图反向投影

收入囊中 meanshift图像聚类 meanshift object detect 葵花宝典 今天有点累,理论就讲少点吧T_T meanshift中文是均值飘逸,就是给定一个点,然后会移动到概率密度最大的地方. 对于图像,什么是概率密度最大? 我们可以定义很多要素: 距离 RGB HSV 下面我有个例子,就是用距离(x,y)和HSV(h,s,v)作图像聚类的. 于是我们有5个要素,当前点与其他点的距离,HSV越接近,则概率密度越高. 假定我们有一点(m,n),如何选择下一个点呢,如何在一个矩形

OPENCV(5) &mdash;&mdash; 图像直方图

新版本对直方图不再使用之前的histogram的形式,而是用统一的Mat或者MatND的格式来存储直方图,可见新版本Mat数据结构的优势. C++: void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, intdims, const int* histSize, const float** ranges, bool uniform=true, bo

opencv:图像直方图均衡化

// 直方图均衡化 Mat gray, dst; cvtColor(src, gray, COLOR_BGR2GRAY); equalizeHist(gray, dst); imshow("gray", gray); imshow("equalizeHist", dst); 原文地址:https://www.cnblogs.com/wbyixx/p/12246837.html

opencv:图像直方图相似性比较

void hist_compare(Mat src1, Mat src2) { int histSize[] = { 256, 256, 256 }; int channels[] = { 0, 1, 2 }; Mat hist1, hist2; float c1[] = { 0, 255 }; float c2[] = { 0, 255 }; float c3[] = { 0, 255 }; const float* histRanges[] = { c1, c2, c3 }; calcHis

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

OpenCV---直方图反向投影

一:直方图反向投影的方法 二:二维直方图的表示 (一)直接显示 def hist2D_demo(image): hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV) hist = cv.calcHist([image],[0,1],None,[289,286],[0,289,0,286]) cv.imshow("hist2D",hist) (二)使用matplotlib def hist2D_demo(image): hsv = cv.cvtColor(i

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

2014-04-11 13:57:03 标签:opencv 图像 直方图 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ronny.blog.51cto.com/8801997/1394118 正如第4篇文章所说的图像直方图在特征提取方面有着很重要的作用,本文将举两个实际工程中非常实用的例子来说明图像直方图的应用. 一.直方图的反向映射. 我们以人脸检测举例,在人脸检测中,我们第一步往往需要先提取图像中皮肤区域来缩小人脸的检

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

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