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

    文章

    1096

    浏览量

    42438
  • 投影
    +关注

    关注

    0

    文章

    147

    浏览量

    25444
  • 图像分割
    +关注

    关注

    4

    文章

    182

    浏览量

    18822

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    没有专利的opencv-python 版本

    功能 图像基础操作 读取/保存(imread/imwrite)、缩放/旋转、裁剪、通道分离/合并 图像处理 灰度转换、阈值分割、形态学操作(腐蚀/膨胀)、模糊(高斯/中值模糊)、锐化 特征检测
    发表于 12-13 12:37

    【GM-3568JHF开发板免费体验】OpenCV开发环境安装和计数程序开发

    count3.py 运行事先准备好的图像识别程序,运行结果如图所示 五、OpenCV图像识别计数 5.1、代码程序 # -*- coding: utf-8
    发表于 08-09 13:30

    Perforce QAC产品简介:面向C/C++的静态代码分析工具(已通过SO 26262认证)

    Perforce QAC专为C/C++开发者打造,支持多种编码规范、功能安全标准(ISO 26262)等,广泛用于汽车、医疗、嵌入式开发领域,可帮助快速识别关键缺陷、提升代码质量、实现合规交付。
    的头像 发表于 07-10 15:57 1464次阅读
    Perforce QAC产品简介:面向<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>的静态<b class='flag-5'>代码</b>分析工具(已通过SO 26262认证)

    基于LockAI视觉识别模块:C++人脸识别

    人脸模板进行比较来实现识别。 2. C++ API 文档 2.1 FaceRecognitionSystem类 2.1.1 头文件 #include <
    发表于 07-01 12:01

    基于LockAI视觉识别模块:C++目标检测

    本文档基于瑞芯微RV1106的LockAI凌智视觉识别模块,通过C++语言做的目标检测实验。 本文档展示了如何使用 lockzhiner_vision_module::vision
    发表于 06-06 14:43

    基于LockAI视觉识别模块:C++条码识别

    的方法来集成条码识别功能,使得开发者可以轻松实现从图像捕捉到数据解码的过程。用户只需简单操作即可快速获取条码中的信息,极大提高了效率和便利性。 2. C++ API文档 2.1
    发表于 05-27 10:26

    基于LockAI视觉识别模块:C++二维码识别

    ZXing和OpenCV支持快速集成到应用中,使用户能轻松扫描并获取二维码信息。 2. C++ API文档 2.1 QRCodeDetector类 2.1.1 头文件 #include <
    发表于 05-26 09:57

    基于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++模板匹配

    /Cpp_example/C02_TemplateMatching 1. 基本知识讲解 1.1 模板匹配的重要性 目标检测:模板匹配可以用于检测图像中的特定对象。 应用场景:广泛应用于物体识别、工业自动化
    发表于 05-13 14:40

    基于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视觉识别模块下OpenCV图像的基本运算方法,包括像素操作、逻辑运算和差值运算,并通过一个综合
    的头像 发表于 05-06 16:20 824次阅读
    基于LockAI视觉识别模块:<b class='flag-5'>C++</b><b class='flag-5'>图像</b>的基本运算

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

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

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

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