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

    文章

    1063

    浏览量

    40041
  • 投影
    +关注

    关注

    0

    文章

    135

    浏览量

    24562
  • 图像分割
    +关注

    关注

    4

    文章

    173

    浏览量

    17860

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

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

收藏 人收藏

    评论

    相关推荐

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

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

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

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

    OpenCV4.8 CUDA编程代码教程

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

    什么是电阻彩色代码

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

    基于FPGA图像处理的高斯模糊实现

    高斯模糊(Gaussian Blur)是一种高斯低通滤波,可以过滤掉图像的高频部分,保留低频部分,对于去除高斯噪声非常有效果,常常被用于图像
    发表于 10-26 09:36 311次阅读
    基于FPGA<b class='flag-5'>图像</b>处理的<b class='flag-5'>高斯</b>模糊实现

    为什么高斯滤波广泛的应用在图像处理中?

    为什么高斯滤波广泛的应用在图像处理中
    发表于 10-09 06:31

    关于CV181x TPU SDK库相关问题求解

    您好,针对CV181xSDK有如下问题,目前情况下是否有办法通过SDK升级解决这些问题呢? 希望有关于cviruntime库的封装,以便可以使用除C++之外的语言进行开发。 目前只适配了图像操作
    发表于 09-18 07:23

    用迅为RK3568开发板使用OpenCV处理图像颜色通道提取ROI

    本小节代码在配套资料“iTOP-3568 开发板\\\\03_【iTOP-RK3568 开发板】指南教程 \\\\04_OpenCV 开发配套资料\\\\07”目录下,如下图所示: 在计算机的色彩图像
    发表于 09-01 10:45

    OpenCV库在图像处理和深度学习中的应用

    本文深入浅出地探讨了OpenCV库在图像处理和深度学习中的应用。从基本概念和操作,到复杂的图像变换和深度学习模型的使用,文章以详尽的代码和解释,带领大家步入
    的头像 发表于 08-18 11:33 486次阅读

    iTOP-3568开发板使用OpenCV处理图像-颜色转换

    本小节代码在配套资料“iTOP-3568 开发板\\\\03_【iTOP-RK3568 开发板】指南教程 \\\\04_OpenCV 开发配套资料\\\\05”目录下,如下图所示
    发表于 08-14 10:46

    如何为Arm编译Cc++代码

    编写CC++应用程序时,需要使用编译器工具链将其编译为机器代码。然后,您可以在基于Arm的处理器上运行此编译的可执行代码,或者使用模型对其进行模拟。 裸机编译编译器工具链包括以下组件
    发表于 08-02 17:28

    学习OpenCV4的系统化路线图

    OpenCV4发布测试版本开始,作者就一直关注!根据自己近十年图像处理OpenCV开发相关工作经验,花了七个月的时间,针对OpenCV4、精心选择
    的头像 发表于 07-05 11:30 368次阅读
    学习<b class='flag-5'>OpenCV</b>4的系统化路线图

    OpenCV FFT模糊检测方法

      在本教程中,您将学习如何使用OpenCV和快速傅里叶变换(FFT)在图像和实时视流中执行模糊检测。 今天的教程是我上一篇关于OpenCV模糊检测的博客文章的扩展 原始模糊检测方法:
    的头像 发表于 06-26 10:47 488次阅读
    <b class='flag-5'>OpenCV</b> FFT模糊检测方法

    从原理到c++代码实现 | 通过球面投影将点云转换为Range图像

    对于一个m线的激光雷达,在扫描的某一时刻会得到m个点,如果旋转一周扫描了n次,那么得到的点云就可以用一个的矩阵来表示。那么怎么把3维的点云投影到2维的距离图像平面呢?这就需要用到球面坐标。
    的头像 发表于 06-21 10:30 892次阅读
    从原理到<b class='flag-5'>c++</b><b class='flag-5'>代码</b>实现 | 通过球面<b class='flag-5'>投影</b>将点云转换为Range<b class='flag-5'>图像</b>

    为什么图片识别要将彩色图像灰度化?

        先前在为大家介绍OCR识别技术时,在图像预处理部分提到了灰度化,大家可能会产生疑惑: 为什么做图片识别要将彩色图像灰度化呢?   正式解释这个问题之前,我们需要了解, 什么是灰度
    发表于 05-28 11:36 1686次阅读
    为什么图片识别要将<b class='flag-5'>彩色</b><b class='flag-5'>图像</b>灰度化?