点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

hello,大家好!今天给大家分享一个最近在做的一个项目,是基于美图的一个专利进行复现的。

希望今天的内容,能让你有所收获,同时值得你分享一波

专利链接:https://patentimages.storage.googleapis.com/21/09/cd/37e7c3a8bdcecf/CN103440633A.pdf

根据他人的思路复现是一项非常重要的能力,由于保密协议,不能将完整的代码分享出来,不过我会提供一些实现各个主要功能的代码,依照这些我想你一定也能够顺利的复现出来。

给你代码只能让你跑通一个案例,

教你解题思路能让你解决一类问题。 

专利的主要思路如下:

# 一种数字图像自动祛除斑点的方法
1、灰度化
2、对比度增强
3、梯度极大值查找
4、皮肤排除
5、孤立点消除
6、高斯模糊
7、阈值处理
8、区域表求和得到最终结果 D
9、根据结果D 与梯度最大值查找的结果对图像A里的斑点进行泊松放出处理,得到自动祛斑的最终效果

这里对其进行了简化,简化成如下几个主要步骤:

1、sobel算子 ——> 找到斑点的可能区域

sobel算子的主要目的是为了检测边缘。

那什么是边缘呢?

图像边缘一般指图像的灰度变化率最大的位置。

具体的计算公式也很容易,这里就不展开说明了

关键代码:

src = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) # 转为灰度图
x_gray = cv2.Sobel(src, cv2.CV_32F, 1, 0)
y_gray = cv2.Sobel(src, cv2.CV_32F, 0, 1)
x_gray = cv2.convertScaleAbs(x_gray)
y_gray = cv2.convertScaleAbs(y_gray)
dst = cv2.add(x_gray, y_gray, dtype=cv2.CV_16S)
dst = cv2.convertScaleAbs(dst)

注意事项:

进行对比度增强能在一定程度上提升最终的效果

对比度增强
# nResult = nColor + (nColor-128)*(1.0+Contrast)/255
# 实现:http://www.cppcns.com/jiaoben/python/218683.html

2、连通域分析——> 确定斑点的位置

听起来好像很复杂,但是实际上看下面的图,你就能明白它要做的是什么东西。

从上图可以发现,使用连通域分析能够找到米粒的位置,同样的,我们也可以将这个算法应用到确定斑点的位置。

但是由于,上面接使用sobel算子计算边缘后,五官等区域也会被视作为一个连通域,如果直接作为后续的处理,那显然是不正确的。

作者是采用直方图颜色模型的统计信息来区分是否为皮肤区域,而我这里则是设置了一个面积的阈值来区别开斑点和其他区域。

关键代码:

# 注意:输入的是二值图,高斯滤波后效果更好
num_labels,labels,stats,centers = cv2.connectedComponentsWithStats(binary, connectivity=8,ltype=cv2.CV_32S)
# 参数说明:
num_labels: 代表连通域的数量,包含背景
labels : 记录img中每个位置对应的label
stats: 每个连通域的外接矩形和面积
x, y, w, h, area = stats[t]
centers : 连通域的质心坐标

依据连通域面积的大小做阈值分割的标准:

for t in range(1, num_labels, 1):x, y, w, h, area = stats[t]if area>100:index = np.where(labels==t)labels[index[0], index[1]] = 0

PS:通过遍历每个连通域,并根据连通域的面积(这里设置阈值100),将面积超过的连通域label设置为0,即为背景。

3、图像修复 inpaint ——> 去除斑点

OpenCV提供了两种算法。两者都可以通过相同的函数访问,cv2.inpaint()。

第一种算法基于Alexandru Telea于2004年发表的“基于快速行进方法的图像修复技术”。它基于快速行进方法。考虑图像中要修复的区域。算法从该区域的边界开始,然后进入区域内,逐渐填充边界中的所有内容。它需要在邻近的像素周围的一个小邻域进行修复。该像素由邻居中所有已知像素的归一化加权和代替。选择权重是一个重要的问题。对于靠近该点的那些像素,靠近边界的法线和位于边界轮廓上的像素,给予更多的权重。一旦像素被修复,它将使用快速行进方法移动到下一个最近的像素。FMM确保首先修复已知像素附近的像素,这样它就像手动启发式操作一样工作。使用标志cv2.INPAINT_TELEA启用此算法。

第二种算法基于Bertalmio,Marcelo,Andrea L. Bertozzi和Guillermo Sapiro于2001年撰写的“Navier-Stokes,流体动力学和图像和视频修补”一文。该算法基于流体动力学并利用偏微分方程。基本原则是heurisitic。它首先沿着已知区域的边缘行进到未知区域(因为边缘是连续的)。它继续等照片(连接具有相同强度的点的线,就像轮廓连接具有相同高度的点一样),同时在修复区域的边界处匹配渐变矢量。为此,使用来自流体动力学的一些方法。获得颜色后,填充颜色以减少该区域的最小差异。使用标志cv2.INPAINT_NS启用此算法。

# 方法 1:
dst_TELEA = cv2.inpaint(img,mask,3,cv2.INPAINT_TELEA)
# 方法2:
dst_NS = cv2.inpaint(img,mask,3,cv2.INPAINT_NS)

PS:这里的img是输入的原图,mask是上面连通域分析查找到的斑点位置。

查看官方的demo:

通过上述一系列的操作后,最终的祛斑效果如下:

是不是看上去还不错。锁骨上的斑点基本上都已经被清除干净了,同时增加了对比度显得皮肤更加有光泽。动手试一波吧!

整理完这篇文章已经十二点多了!

小伙伴,求分享,明天还要七点多起床上班,需要你的鼓励。

参考文献:

sobel算子:https://blog.csdn.net/qq_37124237/article/details/82183177

连通域分析:https://zhuanlan.zhihu.com/p/101371934

美图的专利:https://patentimages.storage.googleapis.com/21/09/cd/37e7c3a8bdcecf/CN103440633A.pdf

图像修补 inpaint:

https://blog.csdn.net/github_39611196/article/details/81252757

cv2.inpaint的原理:

https://www.cnblogs.com/lfri/p/10618417.html

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

美颜算法之自动祛斑算法实现 | 案例分享相关推荐

  1. java美颜算法_美颜算法之自动祛斑算法实现 | 案例分享

    点击上方"AI算法与图像处理",选择加"星标"或"置顶" 重磅干货,第一时间送达 hello,大家好!今天给大家分享一个最近在做的一个项目, ...

  2. 图像美妆算法---自动祛斑算法研究

    目前,市面上有不少的人脸美妆软件,大多数也都有自动去除皮肤斑点痘痘的功能,网上对于手动祛斑的算法已有了相关实现,但是,自动祛斑的算法却少之又少,今天,在这里我简单讲一下这方面的开发经验. 对于自动祛斑 ...

  3. 基于opencv的自动祛斑算法

    首先我们先来看一下详细的逻辑思路: 灰度化 对比度增强 梯度极大值查找 皮肤排除 孤立点消除 高斯模糊 阈值处理 区域表求和得到最终结果D 根据结果D与梯度最大值查找的结果对图像A里的斑点进行泊松放出 ...

  4. 基于自动图像分割算法和扩展数据集深度学习的经济作物病害识别

    基于自动图像分割算法和扩展数据集深度学习的经济作物病害识别 1.作物病害识别出现的问题 实际应用中作物图像的复杂背景信息和训练数据不足会导致深度学习的错误识别. 2.研究内容 提出了一种基于自动图像分 ...

  5. DL之pix2pix:pix2pix(cGAN)自动上色算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略

    DL之pix2pix:pix2pix(cGAN)自动上色算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 目录 pix2pix(cGAN)自动上色算法的简介(论文介绍) 1.论文 2.关 ...

  6. 你知道吗?其实 Oracle 直方图自动统计算法存在这些缺陷!(附验证步骤)

    作者 | 吴海存 责编 | Carol 出品 | CSDN 云计算(ID:CSDNcloud) 封图| CSDN下载于视觉中国 在某些场景下,表中某一列的数据分布会比较崎岖,使得CBO(cost ba ...

  7. oracle 自动表分析,其实 Oracle 直方图自动统计算法存在这些缺陷!

    原标题:其实 Oracle 直方图自动统计算法存在这些缺陷! 科技细分领域TOP10影响力内容第一季度入选作品 来源 | CSDN 作者 | 吴海存 在某些场景下,表中某一列的数据分布会比较崎岖,使得 ...

  8. 数据挖掘算法与现实生活中的应用案例

    数据挖掘算法与现实生活中的应用案例 如何分辨出垃圾邮件"."如何判断一笔交易是否属于欺诈"."如何判断红酒的品质和档次"."扫描王是如何做到 ...

  9. 万字长文解读深度学习算法在自动驾驶规控中的应用

    交流群 | 进"传感器群/滑板底盘群"请加微信号:xsh041388 交流群 | 进"汽车基础软件群"请加微信号:ckc1087 备注信息:群名称 + 真实姓名 ...

最新文章

  1. 区块链c端应用小程序_区块链如何真正起作用? 我建立了一个应用程序向您展示。...
  2. JS_高程6.面向对象的程序设计(2)创建对象_1
  3. linux关闭在线登录用户
  4. python关闭csv文件_使用Python编辑csv文件时跳过标题
  5. pythonfor循环break_python 中 for 循环 if循环 break
  6. Jquery ValidateEngine表单验证
  7. JavaScript大师必须掌握的12个知识点
  8. java二叉树的创建,遍历及其他方法
  9. 深度搜索和广度搜索领接表实现_算法基础04-深度优先搜索、广度优先搜索、二分查找、贪心算法...
  10. ssm医院疫情隔离室管理系统答辩PPT模板
  11. 软件公司的管理规范化了、编制都齐全了,一般小公司是承受不了的这么庞大的开支的...
  12. 如何快速辨识四位数字贴片电阻阻值
  13. InfluxDB在Win10安装与简单入门
  14. 大学生微信小程序项目总结
  15. native数据类型 react_react-native中使用realm数据库
  16. Linux系统启动流程及服务管理控制
  17. 前端开发的流程与规范
  18. authorizationPolicy详解
  19. promise一脸懵逼...
  20. 100个囚犯的脱狱问题

热门文章

  1. 倒计时 3 天!「2019 嵌入式智能国际大会」全日程大公开!
  2. 用Python分析《工作细胞》的一万多条评论后,非漫迷也要入番了
  3. 知否?知否?一文看懂深度文本分类之DPCNN原理与代码
  4. Grid R-CNN解读:商汤最新目标检测算法,定位精度超越Faster R-CNN
  5. 这一次,我拒绝了Python,选择了Go
  6. 人工智能是人性的罗夏测试
  7. 对话 | 不能与人类直接对话的智能硬件都是“伪”智能
  8. 那些有用但不为大家所熟知的 Java 特性
  9. 绝了!这款工具让SpringBoot不再需要Controller、Service、DAO、Mapper!
  10. 观察者模式的Java实现及应用