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

    文章

    1094

    浏览量

    41408
  • 投影
    +关注

    关注

    0

    文章

    145

    浏览量

    25054
  • 图像分割
    +关注

    关注

    4

    文章

    182

    浏览量

    18364

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于LockAI视觉识别模块:C++轮廓检测

    本文档展示了如何使用 OpenCV 进行图像处理和特征检测,包括边缘检测、直线检测、圆检测以及多边形拟合。通过这些技术,可以实现对摄像头捕获的实时视频流进行分析,并标记出检测到的特征。 源代码地址
    发表于 05-22 10:05

    基于LockAI视觉识别模块:C++多模板匹配

    /master/Cpp_example/C03_Template_Matching_more 1. 基本知识讲解 1.1 多模板匹配的重要幸 目标检测:多模板匹配可以用于检测图像中的多个特定对象。 应用场
    发表于 05-14 15:00

    基于LockAI视觉识别模块:C++使用图像的统计信息

    ./Test-Image-information-statistics 5.2 运行效果 在运行上述代码时,会输出以下结果: 6. 总结 通过上述内容,我们介绍了如何使用 OpenCV 提取图像的 ROI、转换颜色空间、计算
    发表于 05-08 10:31

    基于LockAI视觉识别模块:C++图像的基本运算

    图像处理中,理解图像的基本操作是掌握计算机视觉技术的关键。本文章将介绍 基于LockAI视觉识别模块下OpenCV图像的基本运算方法,包括像素操作、逻辑运算和差值运算,并通过一个
    发表于 05-06 16:56

    基于LockAI视觉识别模块:C++图像采集例程

    本文主要演示如何使用LockAI视觉识别模块进行视频流的读取,同时使用Edit模块进行图像传输。基础知识讲解1.1OpenCV简介OpenCV(OpenSourceComputerVisionLibra
    的头像 发表于 04-30 18:23 ?266次阅读
    基于LockAI视觉识别模块:<b class='flag-5'>C++</b><b class='flag-5'>图像</b>采集例程

    基于LockAI视觉识别模块:C++图像采集例程

    本文主要演示如何使用LockAI视觉识别模块进行视频流的读取,同时使用Edit模块进行图像传输。 例程源代码地址:https://gitee.com/LockzhinerAI
    发表于 04-30 10:52

    创建了用于OpenVINO?推理的自定义C++和Python代码,从C++代码中获得的结果与Python代码不同是为什么?

    创建了用于OpenVINO?推理的自定义 C++ 和 Python* 代码。 在两个推理过程中使用相同的图像和模型。 从 C++ 代码
    发表于 03-06 06:22

    DLP4500怎么确定投影仪开始投影的同时相机的c++代码开始运行?

    投影仪通过trig1 链接相机,投影仪投图同时触发相机,相机采集图像并传回电脑,相机的代码里需要添加dlp4500的api或sdk代码吗,
    发表于 02-18 07:16

    代码加密、源代码防泄漏c/c++与git服务器开发环境

    代码加密对于很多研发性单位来说是至关重要的,当然每家企业的业务需求不同所用的开发环境及开发语言也不尽相同,今天主要来讲一下c++及git开发环境的源代码防泄密保护方案。企业源代码泄密
    的头像 发表于 02-12 15:26 ?560次阅读
    源<b class='flag-5'>代码</b>加密、源<b class='flag-5'>代码</b>防泄漏<b class='flag-5'>c</b>/<b class='flag-5'>c++</b>与git服务器开发环境

    AKI跨语言调用库神助攻C/C++代码迁移至HarmonyOS NEXT

    量;某知名社交电商平台使用后减少了50%以上跨语言调用接口代码量;某图像处理软件所有C++代码复用通过AKI来实现。使用AKI后这些项目不仅减少了项目
    发表于 01-02 17:08

    图像高斯滤波的原理及FPGA实现思路

    1.概念 高斯分布 图像滤波之高斯滤波介绍 图像处理算法|高斯滤波 高斯滤波(Gaussian
    的头像 发表于 12-07 09:12 ?1938次阅读
    <b class='flag-5'>图像</b><b class='flag-5'>高斯</b>滤波的原理及FPGA实现思路

    基于OpenCV的拆分和合并图像通道实验案例分享_基于RK3568教学实验箱

    一、实验目的 本节视频的目的是了解图像通道的概念,学习OpenCV的基本操作,并掌握通过OpenCV实现拆分和合并图像通道的方法。 二、实验原理 拆分与合并
    发表于 12-03 14:27

    RK3568 + OpenCV 会碰撞出什么火花?案例详解:2-1 基于OpenCV的画线实验

    一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。 OpenCV具有以下特点: 不管是科
    发表于 12-03 14:09

    高斯滤波的特点有哪些

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

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

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