0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于彩色图像高斯反向投影基于OpenCV的C++代码

OpenCV学堂 来源:OpenCV学堂 作者:OpenCV学堂 2022-05-31 10:31 次阅读

彩色图像高斯反向投影

一:介绍

图像反向投影的最终目的是获取ROI然后实现对ROI区域的标注、识别、测量等图像处理与分析,是计算机视觉人工智能的常见方法之一。图像反向投影通常是彩色图像投影效果会比灰度图像效果要好,原因在于彩色图像带有更多对象细节信息,在反向投影的时候更加容易判断、而转为灰度图像会导致这些细节信息丢失、从而导致分割失败。最常见的是基于图像直方图特征的反向投影。我们这里介绍一种跟直方图反向投影不一样的彩色图像反向投影方法,通过基于高斯的概率分布公式(PDF)估算,反向投影得到对象区域,该方法也可以看做最简单的图像分割方法。缺点是对象颜色光照改变和尺度改变不具备不变性特征。所以需要在光照度稳定情况下成像采集图像数据。 在这种情况下使用的高斯概率密度公式为:

ca2d336c-e030-11ec-ba43-dac502259ad0.png

  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++代码如下:


	
  1. #include

  2. #include

  3. #include

  4. using namespace cv;

  5. using namespace std;

  6. int main(int argc, char** argv) {

  7. // 加载模型图像与测试图像

  8. Mat src = imread("D:/gloomyfish/gc_test.png");

  9. Mat model = imread("D:/gloomyfish/gm.png");

  10. if (src.empty() || model.empty()) {

  11. printf("could not load image... ");

  12. return -1;

  13. }

  14. imshow("input image", src);

  15. // 对每个通道 计算高斯PDF的参数

  16. // 有一个通道不计算,是因为它可以通过1-r-g得到

  17. // 无需再计算

  18. Mat R = Mat::zeros(model.size(), CV_32FC1);

  19. Mat G = Mat::zeros(model.size(), CV_32FC1);

  20. int r = 0, g = 0, b = 0;

  21. float sum = 0;

  22. for (int row = 0; row < model.rows; row++) {

  23. uchar* current = model.ptr(row);

  24. for (int col = 0; col < model.cols; col++) {

  25. b = *current++;

  26. g = *current++;

  27. r = *current++;

  28. sum = b + g + r;

  29. R.at(row, col) = r / sum;

  30. G.at(row, col) = g / sum;

  31. }

  32. }

  33. // 计算均值与标准方差

  34. Mat mean, stddev;

  35. double mr, devr;

  36. double mg, devg;

  37. meanStdDev(R, mean, stddev);

  38. mr = mean.at(0, 0);

  39. devr = mean.at(0, 0);

  40. meanStdDev(G, mean, stddev);

  41. mg = mean.at(0, 0);

  42. devg = mean.at(0, 0);

  43. int width = src.cols;

  44. int height = src.rows;

  45. // 反向投影

  46. float pr = 0, pg = 0;

  47. Mat result = Mat::zeros(src.size(), CV_32FC1);

  48. for (int row = 0; row < height; row++) {

  49. uchar* currentRow = src.ptr(row);

  50. for (int col = 0; col < width; col++) {

  51. b = *currentRow++;

  52. g = *currentRow++;

  53. r = *currentRow++;

  54. sum = b + g + r;

  55. float red = r / sum;

  56. float green = g / sum;

  57. pr = (1 / (devr*sqrt(2 * CV_PI)))*exp(-(pow((red - mr), 2)) / (2 * pow(devr, 2)));

  58. pg = (1 / (devg*sqrt(2 * CV_PI)))*exp(-(pow((green - mg),2)) / (2 * pow(devg, 2)));

  59. sum = pr*pg;

  60. result.at(row, col) = sum;

  61. }

  62. }

  63. // 归一化显示高斯反向投影

  64. Mat img(src.size(), CV_8UC1);

  65. normalize(result, result, 0, 255, NORM_MINMAX);

  66. result.convertTo(img, CV_8U);

  67. Mat segmentation;

  68. src.copyTo(segmentation, img);

  69. // 显示

  70. imshow("backprojection demo", img);

  71. imshow("segmentation demo", segmentation);

  72. waitKey(0);

  73. return 0;

  74. }

三:测试图像与效果演示

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

ca537e82-e030-11ec-ba43-dac502259ad0.jpg

反向投影结果

ca6bdc70-e030-11ec-ba43-dac502259ad0.jpg

分割提取结果

cab28b66-e030-11ec-ba43-dac502259ad0.jpg

四:总结

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

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像
    +关注

    关注

    2

    文章

    1078

    浏览量

    40364
  • 投影
    +关注

    关注

    0

    文章

    141

    浏览量

    24670
  • 图像分割
    +关注

    关注

    4

    文章

    182

    浏览量

    17959

原文标题:彩色图像高斯反向投影

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    高斯滤波的特点有哪些

    高斯滤波作为一种广泛使用的图像处理技术,具有以下几个显著的特点: 平滑性 : 高斯滤波通过卷积操作对图像进行平滑处理,使图像中的高频部分(如
    的头像 发表于 09-29 09:36 144次阅读

    高斯卷积核函数在图像采样中的意义

    高斯卷积核函数在图像采样中的意义主要体现在以下几个方面: 1. 平滑处理与去噪 平滑图像高斯卷积核函数通过其权重分布特性,即中心像素点权重最高,周围像素点权重逐渐降低,实现了对
    的头像 发表于 09-29 09:33 267次阅读

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都觉得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的优化与整理,已经是非常贴近开发的使用习惯与推理方式。与OpenCV的Mat对象对接方式
    的头像 发表于 07-26 09:20 691次阅读

    OpenCV图像识别C++代码

    的头文件 在您的C++代码中,包含以下必要的头文件: # include # include # include # include # include # include # include 读取图像
    的头像 发表于 07-16 10:42 1572次阅读

    opencv图像识别有什么算法

    OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,提供了大量的图像处理和计算机视觉相关的算法。以下是一些常见的OpenCV
    的头像 发表于 07-16 10:40 687次阅读

    opencv-python和opencv一样吗

    的。以下是对OpenCVOpenCV-Python的比较: 编程语言: OpenCV是一个跨平台的库,支持多种编程语言,如C++、Java、Python等。而
    的头像 发表于 07-16 10:38 840次阅读

    C/C++代码动态测试工具VectorCAST插桩功能演示#代码动态测试 #C++

    C++代码
    北汇信息POLELINK
    发布于 :2024年04月18日 11:57:45

    OpenCV图像降噪算法的中值滤波与高斯滤波详解

    图像噪声是指图像中不希望出现的随机亮度或颜色变化,通常会降低图像的清晰度和可辨识度,以及会降低图像的质量并使图像分析和理解更加困难。
    的头像 发表于 04-03 14:58 5840次阅读
    <b class='flag-5'>OpenCV</b><b class='flag-5'>图像</b>降噪算法的中值滤波与<b class='flag-5'>高斯</b>滤波详解

    如何实现PIL和OpenCV之间图像数据的转换呢?

    PIL图像数据格式转换成OpenCV图像数据格式
    的头像 发表于 02-25 13:43 1120次阅读

    基于QT5+OpenCV+OpenVINO C++的应用打包过程

    我用QT C++写了一个YOLOv5模型推理演示应用。
    的头像 发表于 01-26 10:17 1054次阅读
    基于QT5+<b class='flag-5'>OpenCV</b>+OpenVINO <b class='flag-5'>C++</b>的应用打包过程

    C++简史:C++是如何开始的

    MISRA C++:2023,MISRA® C++ 标准的下一个版本,来了!为了帮助您做好准备,我们介绍了 Perforce 首席技术支持工程师 Frank van den Beuken 博士撰写
    的头像 发表于 01-11 09:00 501次阅读
    <b class='flag-5'>C++</b>简史:<b class='flag-5'>C++</b>是如何开始的

    ELF 1技术贴|如何移植OpenCV

    OpenCV拥有了丰富的常用图像处理函数库,采用C/C++语言编写,可以运行在Linux、Windows、Mac等操作系统上流畅运行,并能够快速实现一系列
    的头像 发表于 01-09 13:55 332次阅读
    ELF 1技术贴|如何移植<b class='flag-5'>OpenCV</b>

    OpenCV4.8 CUDA编程代码教程

    OpenCV4支持通过GPU实现CUDA加速执行,实现对OpenCV图像处理程序的加速运行,当前支持加速的模块包括如下。
    的头像 发表于 12-05 09:56 928次阅读
    <b class='flag-5'>OpenCV</b>4.8 CUDA编程<b class='flag-5'>代码</b>教程

    c++多行注释快捷键

    C++中,多行注释(也称为块注释)是一种用于注释大段代码或多个语句的方法。当你希望暂时禁用一些代码或者解释特定部分代码的作用时,多行注释是非常有用的。 在
    的头像 发表于 11-22 10:24 7803次阅读

    什么是电阻彩色代码

    电子发烧友网站提供《什么是电阻彩色代码.doc》资料免费下载
    发表于 11-18 09:17 0次下载
    什么是电阻<b class='flag-5'>彩色</b><b class='flag-5'>代码</b>