opencv曝光算法_【OPENCV】高反差保留算法
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】高反差保留算法相关推荐
- 【Matlab】智能优化算法_蜻蜓优化算法DA
[Matlab]智能优化算法_蜻蜓优化算法DA 1.背景介绍 2.灵感 3.公式推导 3.1 勘探和开发操作 4.算法流程图 5.文件结构 6.伪代码 7.详细代码及注释 7.1 DA.m 7.2 d ...
- 【Matlab】智能优化算法_蚁狮优化算法ALO
[Matlab]智能优化算法_蚁狮优化算法ALO 1.背景介绍 2.基本思想 3.公式推导 3.1 ALO算法的运算符 3.2 蚂蚁的随机游动 3.3 困在蚂蚁坑里 3.4 修建陷阱 3.5 蚂蚁划向 ...
- 【Matlab】智能优化算法_灰狼优化算法GWO
[Matlab]智能优化算法_灰狼优化算法GWO 1.背景介绍 2.基本思想 2.1 等级制度 2.2 狩猎方式 3.公式推导 3.1 社会等级制度 3.2 包围猎物 3.3 包围猎物 3.4 攻击猎 ...
- 机器学习 线性回归算法_探索机器学习算法简单线性回归
机器学习 线性回归算法 As we dive into the world of Machine Learning and Data Science, one of the easiest and f ...
- python实现洗牌算法_洗牌算法及 random 中 shuffle 方法和 sample 方法浅析
对于算法书买了一本又一本却没一本读完超过 10%,Leetcode 刷题从来没坚持超过 3 天的我来说,算法能力真的是渣渣.但是,今天决定写一篇跟算法有关的文章.起因是读了吴师兄的文章 <扫雷与 ...
- hash算法_一致性hash算法简介
一致性hash算法有什么用?我们为什么需要一致性hash算法?这两个问题的答案可以看这篇文章 分布式系统路由算法简介. 了解了一致性hash算法出现的背景,我们来看看什么是一致性hash算法.一致性h ...
- 一致性hash算法_分布式寻址算法
一.分布式寻址算法简介 分布式寻址算法是很重要的内容,不了解这些算法,也就不能透彻的了解各种分布式中间件的原理.简单说一下这些高大上的寻址到底是个啥意思,比如在elasticsearch中,采用的是多 ...
- 多边形之间相交求交点的算法_路径规划算法总结
本文来自知乎网友@搬砖的旺财,地平线机器人算法工程师.作者根据自己本科和硕士阶段的学习经历,整理归纳了所接触过的规划算法. 1.自主机器人近距离操作运动规划体系 在研究自主运动规划问题之前,首先需建立 ...
- java 最少使用(lru)置换算法_缓存置换算法 - LRU算法
LRU算法 1 原理 对于在内存中并且不被使用的数据块就是LRU,这类数据需要从内存中删除,以腾出空间来存储常用的数据. LRU算法(Least Recently Used,最近最少使用),是内存管理 ...
- python 查找算法_七大查找算法(Python)
查找算法 -- 简介 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素. 查找表(Search Table):由同一类型的数据元素构成的集合 关键字(Ke ...
最新文章
- Github的Tom大鸟:我是如何拒绝微软30w的诱惑,专注于Github事业
- 基于OpenCV的彩色空间互转
- Linux系统备份还原工具3(使用Clonezilla/再生龙对硬盘进行镜像和克隆,类似于Ghost)...
- 解决某东对ip限制若兰(nolanjdc)无法获取短信验问题
- 网络推广外包——网络推广外包专员是如何发布软文外链的呢?
- 新款苹果电脑_苹果发布新款MacBookAir 搭载M1芯片7999起
- 拥抱ROS2系列:ROS2概述和实践入门(一)
- Apple Pay 支付集成
- c语言的一些字符串库函数的自己实现
- ajax控件扩展,22.6 扩展控件
- 自定义函数:删除数组B中与数组A重复的值
- 远程桌面命令是什么 如何使用命令连接远程桌面
- 252个常见英语单词词根
- 基于arduino的ESP32 学习笔记(四)基于AIDA64的电脑性能监控
- 基于Nonebot2搭建QQ机器人(二)编写一个自动回复插件
- ICON设计的7个实用原则
- labview对dll的调用
- Mac Safari, Chrome 浏览器劫持 SearchSystem Search 恶意插件移除 尝试Brave浏览器
- 【转】表情识别(一)--传统方法概述
- 写博客的一些感想和想对读者说的话
热门文章
- Android音视频开发学习
- A Game of Thrones(97)
- MFC ListCtrl的cheek框的全选和反选
- 题目1035:找出直系亲属 树
- Windows 无法打开“添加打印机”本地打印后台处理程序服务没有运行。请重新启动打印后台处理程序
- 安卓逆向 -- 算法基础(数字签名)
- Python实现excel重复值计数/记录小白第一次学习
- 用Python下载学习通课程首页的资料
- 固高运动卡的使用 4 运动之PT(点位)运动
- java误删的信息怎么恢复_记一次线上表数据误删恢复过程