OpenCV图像处理中如何利用多尺度融合提升图像细节
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,OpenCV图像处理中如何利用多尺度融合提升图像细节,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言今天为大家介绍一个利用多尺度来
千家信息网最后更新 2025年12月01日OpenCV图像处理中如何利用多尺度融合提升图像细节在这里插入图片描述 原图 效果图
OpenCV图像处理中如何利用多尺度融合提升图像细节,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
前言
今天为大家介绍一个利用多尺度来提升图像细节的算法。如果你想自己的图片细节看起来更加丰富的话可以尝试一下这个算法。
算法原理
核心就是,论文使用了Retinex方法类似的思路,使用了多个尺度的高斯核对原图滤波,然后再和原图做减法,获得不同程度的细节信息,然后通过一定的组合方式把这些细节信息融合到原图中,从而得到加强原图信息的能力。公式十分简单,注意到第一个系数有点特殊,实现的话,直接看下图的几个公式即可。
「从深度学习中特征金字塔网络的思想来看,这个算法实际上就是将不同尺度上的特征图进行了融合,不过这个方式是直接针对原图进行,比较粗暴,但有个好处就是这个算法用于预处理阶段是易于优化的,关于如何优化后面讲SSE指令集优化的时候再来讨论,今天先提供原始的实现啦。」
代码实现
void separateGaussianFilter(const Mat &src, Mat &dst, int ksize, double sigma){
CV_Assert(src.channels()==1 || src.channels() == 3); //只处理单通道或者三通道图像
//生成一维的
double *matrix = new double[ksize];
double sum = 0;
int origin = ksize / 2;
for(int i = 0; i < ksize; i++){
double g = exp(-(i-origin) * (i-origin) / (2 * sigma * sigma));
sum += g;
matrix[i] = g;
}
for(int i = 0; i < ksize; i++) matrix[i] /= sum;
int border = ksize / 2;
copyMakeBorder(src, dst, border, border, border, border, BORDER_CONSTANT);
int channels = dst.channels();
int rows = dst.rows - border;
int cols = dst.cols - border;
//水平方向
for(int i = border; i < rows; i++){
for(int j = border; j < cols; j++){
double sum[3] = {0};
for(int k = -border; k<=border; k++){
if(channels == 1){
sum[0] += matrix[border + k] * dst.at(i, j+k);
}else if(channels == 3){
Vec3b rgb = dst.at(i, j+k);
sum[0] += matrix[border+k] * rgb[0];
sum[1] += matrix[border+k] * rgb[1];
sum[2] += matrix[border+k] * rgb[2];
}
}
for(int k = 0; k < channels; k++){
if(sum[k] < 0) sum[k] = 0;
else if(sum[k] > 255) sum[k] = 255;
}
if(channels == 1)
dst.at(i, j) = static_cast(sum[0]);
else if(channels == 3){
Vec3b rgb = {static_cast(sum[0]), static_cast(sum[1]), static_cast(sum[2])};
dst.at(i, j) = rgb;
}
}
}
//竖直方向
for(int i = border; i < rows; i++){
for(int j = border; j < cols; j++){
double sum[3] = {0};
for(int k = -border; k<=border; k++){
if(channels == 1){
sum[0] += matrix[border + k] * dst.at(i+k, j);
}else if(channels == 3){
Vec3b rgb = dst.at(i+k, j);
sum[0] += matrix[border+k] * rgb[0];
sum[1] += matrix[border+k] * rgb[1];
sum[2] += matrix[border+k] * rgb[2];
}
}
for(int k = 0; k < channels; k++){
if(sum[k] < 0) sum[k] = 0;
else if(sum[k] > 255) sum[k] = 255;
}
if(channels == 1)
dst.at(i, j) = static_cast(sum[0]);
else if(channels == 3){
Vec3b rgb = {static_cast(sum[0]), static_cast(sum[1]), static_cast(sum[2])};
dst.at(i, j) = rgb;
}
}
}
delete [] matrix;
}
Mat MultiScaleDetailBoosting(Mat src, int Radius){
int rows = src.rows;
int cols = src.cols;
Mat B1, B2, B3;
separateGaussianFilter(src, B1, Radius, 1.0);
separateGaussianFilter(src, B2, Radius*2-1, 2.0);
separateGaussianFilter(src, B3, Radius*4-1, 4.0);
float w1 = 0.5, w2 = 0.5, w3 = 0.25;
Mat dst(rows, cols, CV_8UC3);
for(int i = 0; i < rows; i++){
for(int j = 0; j < cols; j++){
for(int k = 0; k < 3; k++){
int D1 = src.at(i, j)[k] - B1.at(i, j)[k];
int D2 = B1.at(i, j)[k] - B2.at(i, j)[k];
int D3 = B2.at(i, j)[k] - B3.at(i, j)[k];
int sign = D1 > 0 ? 1 : -1;
dst.at(i, j)[k] = saturate_cast((1 - w1*sign) * D1 - w2 * D2 + w3 * D3 + src.at(i, j)[k]);
}
}
}
return dst;
}
效果
关于OpenCV图像处理中如何利用多尺度融合提升图像细节问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。
图像
细节
原图
尺度
算法
处理
信息
就是
问题
j++
图像处理
不同
公式
图片
效果
方向
方式
方法
更多
特征
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
扩展dns服务器未响应
中班网络安全教育课后反思
建筑企业人员数据库
数据库备份包还原
今日头条数据库表
阿里巴巴软件开发相关公司
用浏览器连接sql数据库
守望先锋服务器刷新频率
安徽项目软件开发费用
软件开发合同原型可以作为需求吗
英国剑桥基因网络技术
组装一台四五万服务器电脑
计算机网络技术发展职位
班级网络安全声明
我国发生的网络安全大事件
软件开发培训需要多长时间
辽宁2020 网络安全和信息化
七日杀伙伴建完服务器进不去
网络安全法定期开展测评
人民日报有关网络安全的
软件开发设计阶段有什么
集成万兆主板服务器主板
软件开发 流程图 软件
徐汇区市场软件开发收费套餐
软件开发中级证书图片
成都前端软件开发正规平台
voip网络安全测试图
网络安全法限制贸易
360网络安全管家
湖北巨幕服务器虚拟主机