OpenCV图像处理中如何利用多尺度融合提升图像细节
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,OpenCV图像处理中如何利用多尺度融合提升图像细节,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言今天为大家介绍一个利用多尺度来
千家信息网最后更新 2026年10月31日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安全错误
数据库的锁怎样保障安全
保险科技 互联网保险
广东万易互联网科技有限公司惠州分公司
互联网科技公司的优势
互联网通讯科技
科技互联网公司装修
互联网品科技
科技互联网技术
北京互联网科技
火传媒上海互联网科技
互联网科技大会
卓越科技互联网 招聘
广州优美互联网科技
知域互联网科技有限公司大骗子
伊宁互联网科技做什么的
有人说阿里系是互联网科技企业
互联网时代科技型公司的机会
科技信息时代互联网发展
山东蛋芒互联网科技有限公司
陕西彩京云互联网科技有限公司
互联网科技创新方面的资料
互联网科技公司
深圳科技互联网
期待互联网科技
广州凡科互联网科技
广州紫鲸互联网科技
佩信高科技互联网
中盈科技互联网信息有限公司
青岛科技大学互联网大赛研究生
深圳育鹏互联网科技有限公司招聘
互联网科技实习生岗位