资源经验分享直方图反向投影学习-----个人理解(你究竟是不是凶手)

直方图反向投影学习-----个人理解(你究竟是不是凶手)

2019-12-13 | |  108 |   0

原标题:直方图反向投影学习-----个人理解(你究竟是不是凶手)

原文来自:博客园      原文链接:https://www.cnblogs.com/zhiyonglu/p/10734603.html


今天重新学习了一下反向直方图,个人是这样理解的:通过计算模型(现场证据)的图像直方图,再计算待测试(嫌疑人)的图像直方图,然后将嫌疑人的直方图映射到现场证据的直方图中,再将结果显示出来。

 

 原理可以看一下别人的:https://blog.csdn.net/fengye2two/article/details/79113560

 

直方图归一化那么对应的直方图高度就是概率咯,如果你的待测试对象的结果值很大(或者说你的图像更亮),那么说明你是凶手的嫌疑很大!

不过前提是在手掌局部进行绘制直方图,如果对整个图像绘制直方图,你会发现bin值(横坐标)很小的地方,其值也可能很大,因为图上不仅只有手掌部分,还有其他四个角的地方。

 

参考官方文档:

 

下面附上可直接运行的代码和测试图片 1 #include <opencv2/opencv.hpp>


#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
#include <Vector>
#include <string>

using namespace std;
using namespace cv;//这句话必须加入,如果不加入,则下面的统一写成cv::
 
Mat src, hsv, hue, test, test_hue;
const char* window_image = "input image";
int bins = 180;
int main()
{
    src = imread("d:/img/hand.jpg");
    test = imread("d:/img/hand2.jpg");
    namedWindow(window_image, CV_WINDOW_AUTOSIZE);
    namedWindow("test image", CV_WINDOW_AUTOSIZE);
    namedWindow("BackProject", CV_WINDOW_AUTOSIZE);
    namedWindow("Histogram", CV_WINDOW_AUTOSIZE);//histogram 柱状图
    imshow(window_image, src);
    imshow("test image", test);

    //将BGR图像转化为HSV图像
    cvtColor(src, hsv, CV_BGR2HSV);
    hue.create(hsv.size(), hsv.depth());
    int nchannels[] = { 0, 0 };
    mixChannels(&hsv, 1, &hue, 1, nchannels, 1);

    //这是待检测图像
    cvtColor(test, test, CV_BGR2HSV);
    test_hue.create(test.size(), test.depth());
    //int nchannels[] = { 0, 0 };
    mixChannels(&test, 1, &test_hue, 1, nchannels, 1);

    //计算demo的直方图
    float range[] = { 0,180 };
    const float *histRanges = { range };
    Mat h_hist;
    calcHist(&hue, 1, 0, Mat(), h_hist, 1, &bins, &histRanges, true, false);
    normalize(h_hist, h_hist, 0, 255, NORM_MINMAX, -1, Mat());

    //将test的图像根据h_hist,计算反向直方图结果
    Mat backProjImage;
    calcBackProject(&test_hue, 1, 0, h_hist, backProjImage, &histRanges, 1, true);
    imshow("BackProject", backProjImage);

    int hist_h = 400;
    int hist_w = 400;
    Mat histImage;
    histImage.create(hist_w, hist_h, CV_8UC3), Scalar(0, 0, 0);
    int bin_w = (hist_w / bins);
    for (int i = 1; i < bins; i++) {
        rectangle(histImage,
            Point((i - 1)*bin_w, (hist_h - cvRound(h_hist.at<float>(i - 1)*(400 / 255)))),
            Point(i*bin_w, hist_h),
            Scalar(0, 0, 255), -1);
    }
    imshow("Histogram", histImage);

    imshow(window_image, src);

    waitKey(0);
    return 0;
}

 

图片:第一张为demo,第二张为test

结果:

 

以上是个人学习理解,本人也是小白一枚,若大佬们发现有错误,请多多还请多多包涵多多指教!!!



免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com


上一篇:一文梳理人脸识别,看完全都懂了!

下一篇:学习 google file system 心得体会

用户评价
全部评价

热门资源

  • Python 爬虫(二)...

    所谓爬虫就是模拟客户端发送网络请求,获取网络响...

  • TensorFlow从1到2...

    原文第四篇中,我们介绍了官方的入门案例MNIST,功...

  • TensorFlow从1到2...

    “回归”这个词,既是Regression算法的名称,也代表...

  • 机器学习中的熵、...

    熵 (entropy) 这一词最初来源于热力学。1948年,克...

  • TensorFlow2.0(10...

    前面的博客中我们说过,在加载数据和预处理数据时...