彩色图像高斯反向投影
时间:2022-05-07
本文章向大家介绍彩色图像高斯反向投影,主要内容包括彩色图像高斯反向投影、一:介绍、二:算法步骤与代码实现、三:测试图像与效果演示、四:总结、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
彩色图像高斯反向投影
一:介绍
图像反向投影的最终目的是获取ROI然后实现对ROI区域的标注、识别、测量等图像处理与分析,是计算机视觉与人工智能的常见方法之一。图像反向投影通常是彩色图像投影效果会比灰度图像效果要好,原因在于彩色图像带有更多对象细节信息,在反向投影的时候更加容易判断、而转为灰度图像会导致这些细节信息丢失、从而导致分割失败。最常见的是基于图像直方图特征的反向投影。我们这里介绍一种跟直方图反向投影不一样的彩色图像反向投影方法,通过基于高斯的概率分布公式(PDF)估算,反向投影得到对象区域,该方法也可以看做最简单的图像分割方法。缺点是对象颜色光照改变和尺度改变不具备不变性特征。所以需要在光照度稳定情况下成像采集图像数据。 在这种情况下使用的高斯概率密度公式为:
- 输入模型M,对M的每个像素点(R,G,B)计算I=R+G+B r=R/I, g=G/I, b=B/I
- 根据得到权重比例值,计算得到对应的均值 与标准方差
- 对输入图像的每个像素点计算根据高斯公式计算P(r)与P(g)的乘积
- 归一化之后输出结果,即为最终基于高斯PDF的反向投影图像
二:算法步骤与代码实现
- 首先加载模型图像与测试图像
- 根据模型图像计算得到每个通道对应的均值与标准方差参数
- 根据参数方差计算每个像素点的PDF值
- 归一化概率分布图像-即为反向投影图像,显示
- 根据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,高斯混合模型,高斯混合模型正是在此基础上进一步演化而来。
治疗对未来焦虑的良药就在今天你自己的所为
- sqlserver 行转列
- FreeBSD下的工具(sysctl、netstat等)如何移植到F-Stack
- java面试基础知识(一)
- Linq 实现 DataTable 行转列
- sql常用的系统存储过程
- 用DPDK rte_ring实现多进程间通信
- sqlserver 的事务和c#的事务
- Flink DataStream编程指南
- oracle建表、建主键、外键基本语法
- F-Stack KNI配置注意事项
- F-Stack 助力 HTTP 网络服务器性能提升
- How to build Multi-Language Web Sites with ASP.NET 2.0 and VS.Net 2005
- 动态生成TreeView方法(二)
- Gradle打jar包如何上传到maven本地库
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 用R语言中的神经网络预测时间序列:多层感知器和极限学习机
- 基于R语言股票市场收益的统计可视化分析
- Mac系统R语言升级后无法加载包报错 package or namespace load failed in dyn.load
- 如何从xml文件创建R语言数据框dataframe
- Matlab马尔可夫链蒙特卡罗法(MCMC)估计随机波动率(SV) 模型
- 如何从xml文件创建R语言数据框dataframe
- R语言POT超阈值模型和极值理论EVT分析
- R语言使用灰色关联分析(Grey Relation Analysis,GRA)中国经济社会发展指标
- R语言中的模拟过程和离散化:泊松过程和维纳过程
- R语言Lee-Carter模型对年死亡率建模预测预期寿命
- R语言有极值(EVT)依赖结构的马尔可夫链(MC)对洪水极值分析
- RxSwift 封装 CoreBluetooth(一) 配置
- Golang 操作Excel文件
- 腾讯云TKE-搭建prometheus监控(一)
- Android开发中ProgressDialog简单用法示例