大数跨境
0
0

实践教程|彩色图像高斯反向投影

实践教程|彩色图像高斯反向投影 极市平台
2022-05-31
1
↑ 点击蓝字 关注极市平台

作者丨lovelygirl
来源丨OpenCV学堂
编辑丨极市平台

极市导读

 

本文介绍了一种跟直方图反向投影不一样的彩色图像反向投影方法,通过基于高斯的概率分布公式(PDF)估算,反向投影得到对象区域,该方法也可以看做最简单的图像分割方法。 >>加入极市CV技术交流群,走在计算机视觉的最前沿

一:介绍

图像反向投影的最终目的是获取ROI然后实现对ROI区域的标注、识别、测量等图像处理与分析,是计算机视觉与人工智能的常见方法之一。图像反向投影通常是彩色图像投影效果会比灰度图像效果要好,原因在于彩色图像带有更多对象细节信息,在反向投影的时候更加容易判断、而转为灰度图像会导致这些细节信息丢失、从而导致分割失败。最常见的是基于图像直方图特征的反向投影。

我们这里介绍一种跟直方图反向投影不一样的彩色图像反向投影方法,通过基于高斯的概率分布公式(PDF)估算,反向投影得到对象区域,该方法也可以看做最简单的图像分割方法。缺点是对象颜色光照改变和尺度改变不具备不变性特征。所以需要在光照度稳定情况下成像采集图像数据。在这种情况下使用的高斯概率密度公式为:

其中 表示均值、 表示标准方差。

算法实现步骤为:

  1. 输入模型M,对M的每个像素点(R,G,B)计算I=R+G+B r=R/I, g=G/I, b=B/I

  2. 根据得到权重比例值,计算得到对应的均值 与标准方差

  3. 对输入图像的每个像素点计算根据高斯公式计算P(r)与P(g)的乘积

  4. 归一化之后输出结果,即为最终基于高斯PDF的反向投影图像

二:算法步骤与代码实现

  1. 首先加载模型图像与测试图像

  2. 根据模型图像计算得到每个通道对应的均值与标准方差参数

  3. 根据参数方差计算每个像素点的PDF值

  4. 归一化概率分布图像-即为反向投影图像,显示

  5. 根据Mask得到最终颜色模型对象分割

完整的基于OpenCV的C++代码如下:

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

using namespace cv;
using namespace std;

int main(int argc, char** argv) {
    // 加载模型图像与测试图像
    Mat src = imread("D:/gloomyfish/gc_test.png");
    Mat model = imread("D:/gloomyfish/gm.png");
    if (src.empty() || model.empty()) {
        printf("could not load image...\n");
        return -1;
    }
    imshow("input image", src);

    // 对每个通道 计算高斯PDF的参数
    // 有一个通道不计算,是因为它可以通过1-r-g得到
    // 无需再计算
    Mat R = Mat::zeros(model.size(), CV_32FC1);
    Mat G = Mat::zeros(model.size(), CV_32FC1);
    int r = 0, g = 0, b = 0;
    float sum = 0;
    for (int row = 0; row < model.rows; row++) {
        uchar* current = model.ptr<uchar>(row);
        for (int col = 0; col < model.cols; col++) {
            b = *current++;
            g = *current++;
            r = *current++;
            sum = b + g + r;
            R.at<float>(row, col) = r / sum;
            G.at<float>(row, col) = g / sum;
        }
    }

    // 计算均值与标准方差
    Mat mean, stddev;
    double mr, devr;
    double mg, devg;
    meanStdDev(R, mean, stddev);
    mr = mean.at<double>(0, 0);
    devr = mean.at<double>(0, 0);

    meanStdDev(G, mean, stddev);
    mg = mean.at<double>(0, 0);
    devg = mean.at<double>(0, 0);

    int width = src.cols;
    int height = src.rows;

    // 反向投影
    float pr = 0, pg = 0;
    Mat result = Mat::zeros(src.size(), CV_32FC1);
    for (int row = 0; row < height; row++) {
        uchar* currentRow = src.ptr<uchar>(row);
        for (int col = 0; col < width; col++) {
            b = *currentRow++;
            g = *currentRow++;
            r = *currentRow++;
            sum = b + g + r;
            float red = r / sum;
            float green = g / sum;
            pr = (1 / (devr*sqrt(2 * CV_PI)))*exp(-(pow((red - mr), 2)) / (2 * pow(devr, 2)));
            pg = (1 / (devg*sqrt(2 * CV_PI)))*exp(-(pow((green - mg),2)) / (2 * pow(devg, 2)));
            sum = pr*pg;
            result.at<float>(row, col) = sum;
        }
    }

    // 归一化显示高斯反向投影
    Mat img(src.size(), CV_8UC1);
    normalize(result, result, 0, 255, NORM_MINMAX);
    result.convertTo(img, CV_8U);
    Mat segmentation;
    src.copyTo(segmentation, img);

    // 显示
    imshow("backprojection demo", img);
    imshow("segmentation demo", segmentation);

    waitKey(0);
    return 0;
}

三:测试图像与效果演示

蓝色矩形框为模型,整个图像为测试图像

反向投影结果

分割提取结果

四:总结

大家看了这个例子总是有点怪怪的,总会想起点什么,如果你能想起点什么的话就是GMM,高斯混合模型,高斯混合模型正是在此基础上进一步演化而来。





公众号后台回复“CVPR 2022”获取论文合集打包下载~

△点击卡片关注极市平台,获取最新CV干货
极市干货
CVPR 2022:CVPR'22 最新132篇论文分方向整理CVPR'22 最新106篇论文分方向整理一文看尽 CVPR 2022 最新 20 篇 Oral 论文
极市动态:阿启视x卓见云x极视角签署战略合作协议,加快人工智能应用落地
最新竞赛:六大真实场景赛题!ECV2022极市计算机视觉开发者榜单大赛预报名开启


CV技术社群邀请函 #

△长按添加极市小助手
添加极市小助手微信(ID : cvmart4)

备注:姓名-学校/公司-研究方向-城市(如:小极-北大-目标检测-深圳)


即可申请加入极市目标检测/图像分割/工业检测/人脸/医学影像/3D/SLAM/自动驾驶/超分辨率/姿态估计/ReID/GAN/图像增强/OCR/视频理解等技术交流群


每月大咖直播分享、真实项目需求对接、求职内推、算法竞赛、干货资讯汇总、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企视觉开发者互动交流~


觉得有用麻烦给个在看啦~  
【声明】内容源于网络
0
0
极市平台
为计算机视觉开发者提供全流程算法开发训练平台,以及大咖技术分享、社区交流、竞赛实践等丰富的内容与服务。
内容 8155
粉丝 0
极市平台 为计算机视觉开发者提供全流程算法开发训练平台,以及大咖技术分享、社区交流、竞赛实践等丰富的内容与服务。
总阅读919
粉丝0
内容8.2k