Tags: DIP

高反差保留算法就是保留原图中反差比较大的地方,比如,一幅人脸图像中,反差比较大的地方就是五官了,在进行人脸美化的时候我们通常会对原图进行平滑处理,然而处理完之后丢失了图片的细节信息,因此在另一边我们通过会通过高反差保留或者其他高通滤波器保留图片的细节信息,然后将平滑之后的图像和高频图像进行光线性混合,可以得到更好的效果。

具体到高反差保留算法,先使用高斯滤波器对图像进行平滑,高斯滤波器对边缘的平滑作用更加明显,使用原图减去高斯平滑之后的图,就得到强化边缘值。通过调节高斯模糊的半径可以控制得到的边缘的强度。

公式1

高反差保留 = 原图 - 高斯模糊图

然后将原图和高反差保留图进行叠加,可以得到锐化的图像。

#include

#include

#include

#include

#include

int main(){

cv::Mat img = cv::imread("/Users/yuhua.cheng/Documents/data/Lenna.png",-1);

if(img.empty()){

std::cout << "Unable to load image!" << std::endl;

return -1;

}

cv::cvtColor(img, img, cv::COLOR_RGBA2RGB);

cv::Mat temp1;

cv::GaussianBlur(img, temp1, cv::Size(5,5),0,0);

cv::Mat temp2 = img - temp1;

cv::imshow("highPass",temp2);

// cv::Mat result = img + temp2;

cv::Mat result;

cv::addWeighted(temp2, 1, img, 1, 0, result);

cv::imshow("img", img);

cv::imshow("result",result);

cv::imwrite("./result/highPass.jpg", result);

cv::waitKey(0);

return 0;

}

原图:

55dQql.jpg

结果:

55d31A.jpg

公式2

r = (pixel[x,y] - blur(R)[x,y])/128

pixel[x,y]r+128(1-r)

R为高斯模糊半径

高反差保留图:

55dcVS.jpg

结果:

55dryh.jpg

公式3

r = (pixel[x,y] - blur(R)[x,y])

128+|r|r/(2R)

R为高斯模糊半径

高反差保留图:

55dP7z.jpg

结果:

55dyEa.jpg

#include

#include

#include

#include

#include

cv::Mat highPass1(const cv::Mat, int);

cv::Mat highPass2(const cv::Mat, int);

int main(){

cv::Mat img = cv::imread("/Users/yuhua.cheng/Documents/data/Lenna.png",-1);

if(img.empty()){

std::cout << "Unable to load image!" << std::endl;

return -1;

}

cv::cvtColor(img, img, cv::COLOR_RGBA2RGB);

highPass1(img, 7);

highPass2(img, 7);

cv::Mat temp1;

cv::GaussianBlur(img, temp1, cv::Size(5,5),0,0);

cv::Mat temp2 = img - temp1;

cv::imshow("highPass",temp2);

cv::imwrite("./result/highPass.jpg",temp2);

// cv::Mat result = img + temp2;

cv::Mat result;

cv::addWeighted(temp2, 1, img, 1, 0, result);

cv::imshow("img", img);

cv::imshow("result",result);

cv::imwrite("./result/augmented.jpg", result);

cv::waitKey(0);

return 0;

}

cv::Mat highPass1(const cv::Mat img, int kSize){

int height = img.rows;

int width = img.cols;

cv::Mat blur;

cv::Mat result = img.clone();

cv::GaussianBlur(img, blur, cv::Size(kSize, kSize), 0, 0);

double r[3];

for(int x = 0; x < height; x++){

for(int y = 0; y < width; y++){

for(int i = 0; i < 3; i++){

// r[i] = (double(img.at<:vec3b>(x,y)[i]) - double(blur.at<:vec3b>(x,y)[i]))/128;

// result.at<:vec3b>(x,y)[i] = cv::saturate_cast(img.at<:vec3b>(x,y)[i]*r[i] + 128*(1-r[i]));

r[i] =img.at<:vec3b>(x,y)[i] - blur.at<:vec3b>(x,y)[i];

result.at<:vec3b>(x,y)[i] = cv::saturate_cast(128 + abs(r[i])*r[i]/(2*kSize));

}

}

}

imshow("hightPass1", result);

imwrite("./result/highPass1.jpg",result);

addWeighted(img, 1, result, 0.1, 0, result);

imshow("result", result);

imwrite("./result/result1.jpg", result);

return result;

}

cv::Mat highPass2(const cv::Mat img, int kSize){

int height = img.rows;

int width = img.cols;

cv::Mat blur;

cv::Mat result = img.clone();

cv::GaussianBlur(img, blur, cv::Size(kSize, kSize), 0, 0);

double r[3];

for(int x = 0; x < height; x++){

for(int y = 0; y < width; y++){

for(int i = 0; i < 3; i++){

r[i] = (double(img.at<:vec3b>(x,y)[i]) - double(blur.at<:vec3b>(x,y)[i]))/128;

result.at<:vec3b>(x,y)[i] = cv::saturate_cast(img.at<:vec3b>(x,y)[i]*r[i] + 128*(1-r[i]));

}

}

}

imshow("hightPass2", result);

imwrite("./result/highPass2.jpg",result);

addWeighted(img, 1, result, 0.1, 0, result);

imshow("result", result);

imwrite("./result/result2.jpg", result);

return result;

}

后面两种方法也是看别人给的公式,但是我觉得还是第一种方法的效果最好,虽然很简单。

opencv曝光算法_【OPENCV】高反差保留算法相关推荐

  1. 【Matlab】智能优化算法_蜻蜓优化算法DA

    [Matlab]智能优化算法_蜻蜓优化算法DA 1.背景介绍 2.灵感 3.公式推导 3.1 勘探和开发操作 4.算法流程图 5.文件结构 6.伪代码 7.详细代码及注释 7.1 DA.m 7.2 d ...

  2. 【Matlab】智能优化算法_蚁狮优化算法ALO

    [Matlab]智能优化算法_蚁狮优化算法ALO 1.背景介绍 2.基本思想 3.公式推导 3.1 ALO算法的运算符 3.2 蚂蚁的随机游动 3.3 困在蚂蚁坑里 3.4 修建陷阱 3.5 蚂蚁划向 ...

  3. 【Matlab】智能优化算法_灰狼优化算法GWO

    [Matlab]智能优化算法_灰狼优化算法GWO 1.背景介绍 2.基本思想 2.1 等级制度 2.2 狩猎方式 3.公式推导 3.1 社会等级制度 3.2 包围猎物 3.3 包围猎物 3.4 攻击猎 ...

  4. 机器学习 线性回归算法_探索机器学习算法简单线性回归

    机器学习 线性回归算法 As we dive into the world of Machine Learning and Data Science, one of the easiest and f ...

  5. python实现洗牌算法_洗牌算法及 random 中 shuffle 方法和 sample 方法浅析

    对于算法书买了一本又一本却没一本读完超过 10%,Leetcode 刷题从来没坚持超过 3 天的我来说,算法能力真的是渣渣.但是,今天决定写一篇跟算法有关的文章.起因是读了吴师兄的文章 <扫雷与 ...

  6. hash算法_一致性hash算法简介

    一致性hash算法有什么用?我们为什么需要一致性hash算法?这两个问题的答案可以看这篇文章 分布式系统路由算法简介. 了解了一致性hash算法出现的背景,我们来看看什么是一致性hash算法.一致性h ...

  7. 一致性hash算法_分布式寻址算法

    一.分布式寻址算法简介 分布式寻址算法是很重要的内容,不了解这些算法,也就不能透彻的了解各种分布式中间件的原理.简单说一下这些高大上的寻址到底是个啥意思,比如在elasticsearch中,采用的是多 ...

  8. 多边形之间相交求交点的算法_路径规划算法总结

    本文来自知乎网友@搬砖的旺财,地平线机器人算法工程师.作者根据自己本科和硕士阶段的学习经历,整理归纳了所接触过的规划算法. 1.自主机器人近距离操作运动规划体系 在研究自主运动规划问题之前,首先需建立 ...

  9. java 最少使用(lru)置换算法_缓存置换算法 - LRU算法

    LRU算法 1 原理 对于在内存中并且不被使用的数据块就是LRU,这类数据需要从内存中删除,以腾出空间来存储常用的数据. LRU算法(Least Recently Used,最近最少使用),是内存管理 ...

  10. python 查找算法_七大查找算法(Python)

    查找算法 -- 简介 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素. 查找表(Search Table):由同一类型的数据元素构成的集合 关键字(Ke ...

最新文章

  1. tabBar 自定义,小程序自定义底部导航栏
  2. 4篇SCI,获得多次国奖,这个硕士小姐姐分享科研之路
  3. React 的性能优化(一)当 PureComponent 遇上 ImmutableJS
  4. 十年之后再看“面向对象”
  5. 如何在present出来的viewController里使用push方法
  6. 恶意软件盯上了加密货币,两家以色列公司受到攻击
  7. java中会存在内存泄漏吗,请简单描述
  8. 怎么打包图片_怎么将许多张照片打包发到邮箱?
  9. go struct结构
  10. @IT老司机 6月3日,扫除技术与产品选型难题,CSDN选型智囊团来了!
  11. 编程真可怕,我们日常都在写 Bug
  12. [51nod]1284 2 3 5 7的倍数
  13. Vue知识点笔记(基础篇)
  14. word怎么把页面顺序倒过来_Word打印错乱——出现两个第1页
  15. Google 开通免费主机服务,如果你有email帐户,你就可以注册,目前最多只能存放40页面...
  16. 【转载】APP通用测试用例大全
  17. UE5——材质学习笔记(4):溶解材质
  18. OVM学习--持续更新
  19. latex 标题chapter section里的英文和数字不加粗
  20. 迅雷下载太慢怎么办?

热门文章

  1. 小象学院——面向对象的特点
  2. Android-资深架构师的成长之路(技术详细介绍),flutterui套件
  3. rap技术原理_学rap最基本的都要学什么
  4. matlabrobert锐化_matlab梯度法中5种图像锐化方法分别对一幅图像实现锐化。
  5. 《关键对话》如何高效能沟通之掌握关键对话
  6. 通灵学院|游戏设计研习3:人类的内在人群特征★(1000字)
  7. Django 2.1.7 Celery 4.3.0 Periodic Tasks 周期性任务调度
  8. 史上最美大型互联网机房综合布线图鉴
  9. linear-gradient实现Ps标尺
  10. 功能测试数据测试之错误推测方法