点击上方“AI算法与图像处理”,选择加"星标"或“置顶”

重磅干货,第一时间送达

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中每个位置对应的labelstats: 每个连通域的外接矩形和面积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

最后分析一句话,与君共勉!

也许你想造火箭,但此刻建议你先学会拧螺丝

最后的最后求一波分享!YOLOv4 trick相关论文已经下载并放在公众号后台

关注“AI算法与图像处理”,回复 “200714”获取

个人微信

请注明:

地区+学校/企业+研究方向+昵称

如果没有备注不拉群!

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

  1. Python_机器学习_算法_第1章_K-近邻算法

    Python_机器学习_算法_第1章_K-近邻算法 文章目录 Python_机器学习_算法_第1章_K-近邻算法 K-近邻算法 学习目标 1.1 K-近邻算法简介 学习目标 1 什么是K-近邻算法 1 ...

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

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

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

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 hello,大家好!今天给大家分享一个最近在做的一个项目,是基于美 ...

  4. java实现apriori算法_七大经典、常用排序算法的原理、Java 实现以及算法分析

    0. 前言 大家好,我是多选参数的程序员,一个正再 neng 操作系统.学数据结构和算法以及 Java 的硬核菜鸡.数据结构和算法是我准备新开的坑,主要是因为自己再这块确实很弱,需要大补(残废了一般) ...

  5. weka java 分类算法_使用Weka快速实践机器学习算法

    [译者注]在当下人工智能火爆发展的局面,每时每刻都有新的技术在诞生,但如果你是一个新手,Weka或许能帮助你直观.快速的感受机器学习带来的解决问题的新思路. Weka使机器学习的应用变得简单.高效并且 ...

  6. lisp线性标注自动避让_优化的标牌自动避让算法

    优化的标牌自动避让算法 马超 ; 黄煜 ; 张建伟 [期刊名称] <计算机工程与设计> [年 ( 卷 ), 期] 2012(033)009 [摘要] 为解决传统标牌自动避让算法导致标牌频繁 ...

  7. 错误录入 算法_如何使用验证错误率确定算法输出之间的关系

    错误录入 算法 Monument (www.monument.ai) enables you to quickly apply algorithms to data in a no-code inte ...

  8. 沃舍尔算法_[数据结构拾遗]图的最短路径算法

    前言 本专题旨在快速了解常见的数据结构和算法. 在需要使用到相应算法时,能够帮助你回忆出常用的实现方案并且知晓其优缺点和适用环境.并不涉及十分具体的实现细节描述. 图的最短路径算法 最短路径问题是图论 ...

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

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

最新文章

  1. MongoDB命令及SQL语法对比
  2. 坐标系转换(镜像与对换)
  3. 最好最坏和平均情况下的性能分析
  4. python与Excel的完美结合
  5. Android UncaughtExceptionHandler 全局异常监控
  6. Windows 下安装Pytorch
  7. HTML5培训分享:HTML5全栈工程师是什么?
  8. 计算机专业需要转正定级吗,全日制本科考进事业单位,没有取得初级资格职称,转正后能直接聘用为专业技术十二级岗位吗?...
  9. Xposed是如何为所欲为的?
  10. 两列数据找出相同项自动对应_关于数据核对的6个超级技巧,用过的人都说好...
  11. dropzonejs中文翻译手册 DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库....
  12. 慕课网仿去哪儿项目笔记--(一)-初始化准备
  13. Mac 终端运行jar文件
  14. 艾宾浩斯记单词 记忆周期时间表
  15. 项目管理 : 项目管理技术的七大优势
  16. 简述什么是“零信任”
  17. jmeter批量上传图片, csv文件参数化——详细讲解
  18. python中的path的使用
  19. c++链表(学生信息)
  20. 【无标题】SimpleDateFormat,以及date的.parse()方法

热门文章

  1. 速看!没有比这更全面的 Firebase 介绍!
  2. HTML表单标签,总结到位
  3. VScode Shortcuts for Mac
  4. 如何给注册中心锦上添花?
  5. 【历史上的今天】7 月 19 日:IMAP 协议之父出生;Project Kotlin 公开亮相;CT 成像实现新突破
  6. 数字IC设计工程师职业发展规划是什么样的?
  7. C语言操作SQLite3简明教程
  8. PAT甲级真题目录(按题型整理)(转自柳神)
  9. Linux下实现聊天室
  10. 详解Vue中使用scope进行样式隔离