zoukankan      html  css  js  c++  java
  • opencv —— calcBackProject 反向投影

    反向投影的工作原理

    反向投影图中,某一位置(x,y)的像素值 = 原图对应位置(x,y)像素值在原图的总数目。 即若原图中(5,5)位置上像素值为 200,而原图中像素值为 200 的像素点有 500 个,则反向投影图中(5,5)位置上的像素值就设为 500。

    具体步骤:

    1. 计算图像直方图:统计各像素值(或像素区间)在原图的总数量。
    2. 将直方图数值归一化到 [0,255] 。
    3. 对照直方图,实现反向投影。

    反向投影的作用

    反向投影用于在输入图像(通常较大)中查找与模板图像(通常较小甚至仅 1 个像素)最匹配的点或区域,也就是确定模板图像在输入图像中的位置。

    计算反向投影:calcBackProject 函数

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

    • images,输入的图像(或图像集),它们需为相同深度(CV_8U 或 CV_32F)和相同尺寸,而通道数任意。
    • nimages,输入图像个数。
    • channels,需要统计图像的通道索引即第几个通道,第一幅图的通道索引可选范围 [0, images[0].channels() - 1],第二幅图的通道索引可选范围 [images[0].channels(), images[0].channels() + images[1].channels() - 1] 以此类推。
    • hist,输入的直方图。
    • backProject,反向投影图像,需为单通道,并且和 images[0] 有相同的大小和深度。
    • ranges,直方图中 x 轴的取值范围。
    • scale,缩放因子,backProject [i][j] = scale * hist [images[k] [i][j]],有默认值 1。
    • uniform,直方图是否均匀化的标识符,有默认值 true。

    代码示例:

    #include<opencv.hpp>
    #include<iostream>
    using namespace std;
    using namespace cv;
    Mat src, hsvImg, hist;
    vector<Mat>hsv;
    int histSize = 5;
    void ChangeHistSize(int, void*) {
        if (histSize == 0) {
            histSize = 1;
        }
        //计算 H 通道直方图 https://www.cnblogs.com/bjxqmy/p/12378312.html
        int channels[] = { 0 };
        float hr[] = { 0,180 };
        const float *ranges[] = { hr };
        calcHist(&hsv[0], 1, &channels[0], Mat(), hist, 1, &histSize, &ranges[0]);
        normalize(hist, hist, 255, 0, NORM_L1);
        imshow("hist", hist);
    
        //计算反向投影
        Mat backImg;
        calcBackProject(&src, 1, &channels[0], hist, backImg, &ranges[0], 1);
        imshow("backImg", backImg);
    }
    int main() {
        src = imread("C:/Users/齐明洋/Desktop/证件照/1.jpg");
        imshow("src", src);
    
        //转换为 HSV 通道图像
        cvtColor(src, hsvImg, COLOR_BGR2HSV);
        imshow("hsvImg", hsvImg);
    
        //通道分离
        split(hsvImg, hsv);
        imshow("hImg", hsv[0]);
    
        namedWindow("backImg");
        createTrackbar("histSize", "backImg", &histSize, 180, ChangeHistSize);
        ChangeHistSize(0, 0);
    
        waitKey(0);
    }

    效果演示:

     

    借鉴博客:https://blog.csdn.net/fengye2two/article/details/79113560

  • 相关阅读:
    分享一份Java架构师学习资料,2019年最新整理!
    Spring Boot 最核心的 25 个注解,都是干货!
    推荐一款接口 API 设计神器!
    题库
    杂乱的知识点
    mysql查询疯狂41例
    mysql你问我答
    可能出现的面试题
    SQLALchemy
    基于蓝图的完整的Flask项目
  • 原文地址:https://www.cnblogs.com/bjxqmy/p/12452420.html
Copyright © 2011-2022 走看看