Python-opencv实现美图秀秀磨皮魔法笔

  • 前言
  • 一、涉及技术
    • 1.Opencv鼠标响应setMouseCallback()
    • 2.双边滤波
  • 二、具体实现
    • 1.代码
    • 2.结果展示
    • 3.一些注释

前言

最近有时间写一写博客,突发奇想实现一个鼠标点击对面部磨皮效果的demo,写的比较简单仅供大家学习参考。


一、涉及技术

1.Opencv鼠标响应setMouseCallback()

OpenCV-Python中可以使用setMouseCallback来设置鼠标事件的回调函数

语法格式如下:

cv2.setMouseCallback(windowName,dc)

相关参数说明如下:

  • windowName:创建窗口的名字
  • dc:鼠标响应函数,回调函数

回调函数格式

dc(event,x,y,flags,param)

相关参数说明如下:

  • event 是鼠标事件,具体事件如下所示
  • x,y 是鼠标点击时图像的坐标
  • flags 是CV_EVENT_FLAG的组合
  • param 是自定义传递到setMouseCallback函数的参数

event 具体说明如下:

  • EVENT_MOUSEMOVE //滑动
  • EVENT_LBUTTONDOWN //左键点击
  • EVENT_RBUTTONDOWN //右键点击
  • EVENT_MBUTTONDOWN //中键点击
  • EVENT_LBUTTONUP //左键放开
  • EVENT_RBUTTONUP //右键放开
  • EVENT_MBUTTONUP //中键放开
  • EVENT_LBUTTONDBLCLK //左键双击
  • EVENT_RBUTTONDBLCLK //右键双击
  • EVENT_MBUTTONDBLCLK //中键双击

2.双边滤波

语法格式如下:

cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)

相关参数说明如下:

  • src:待处理图像
  • d:过滤时,每个像素邻域的直径范围
  • sigmaColor: 颜色空间过滤器的sigma值
  • sigmaSpace: 坐标空间中滤波器的sigma值

二、具体实现

1.代码

import cv2
import numpy as npix,iy=-1,-1
# 画笔半径
radius = 8# 人脸磨皮
def face_dermabrasion(cut_image,mask,x,y):# 创建待处理图像pending_image = cv2.bitwise_and(cut_image, cut_image, mask=mask)# 双边滤波blur_img = cv2.bilateralFilter(pending_image, 15, 60, 60)# 图像融合fusion_img = cv2.addWeighted(pending_image, 0.3, blur_img, 0.7, 0)not_mask = 255 - maskback_img = cv2.bitwise_and(fusion_img, fusion_img, mask=mask)# cv2.imshow('back_img',back_img)front_img = cv2.bitwise_and(cut_image, cut_image, mask=not_mask)# cv2.imshow('front_img',front_img)result_img = cv2.add(back_img, front_img)# cv2.imshow('result_img',result_img)img[y-(2*radius):y+(2*radius),x-(2*radius):x+(2*radius)] = result_imgdef dc(event,x,y,flags,param):global ix,iymask = np.zeros([img.shape[0],img.shape[1]],dtype=np.uint8)# 鼠标左键点击if event==cv2.EVENT_LBUTTONDOWN:ix,iy=x,y# print(ix,iy)cv2.circle(mask, (ix, iy), radius, (255, 255, 255), -1)cut_image = img[iy-(2*radius):iy+(2*radius),ix-(2*radius):ix+(2*radius)]new_mask = mask[iy-(2*radius):iy+(2*radius),ix-(2*radius):ix+(2*radius)]face_dermabrasion(cut_image,new_mask,ix,iy)if __name__ == '__main__':# 读取图像img = cv2.imread('g:/face.jpg')cv2.namedWindow('img')cv2.setMouseCallback('img',dc)while(1):cv2.imshow('img',img)cv2.waitKey(1)&0xFF

2.结果展示

左边为原图,大概用鼠标点了几个地方,没有全部处理,效果如右图所示。

3.一些注释

  • 运行时发现了一点小bug,选取边缘的时候没有设置图像边界,更改一下图像边界就可以了,在此不做修改了~
  • 画笔半径设置成了全局变量可以控制画笔半径的大小,后续可拓展成界面输入参数

Python-opencv利用setMouseCallback实现美图秀秀磨皮魔法笔相关推荐

  1. android 动态显示多张图片,美图秀秀上线“魔法照片”功能:静态图片秒变动态大片!...

    一键生成大片,教你制作化静为动的"魔法照片" "魔法照片"的灵感来源于哈利波特的魔法世界,在神奇的魔法加持下,一张静态报纸中的人物竟然动了起来,现在这种神奇的效 ...

  2. html放多张gif动态背景图片,美图秀秀上线“魔法照片”功能:静态图片秒变动态大片...

    [TechWeb]6月5日,美图秀秀最新推出基于AI技术的隐藏功能-"魔法照片",包括头发流动.鲜花环绕.花瓣变身.滤色叠加.空间位移.火焰星云等10多种魔法效果,用户可以将静态照 ...

  3. 美图秀秀神奇消除笔 轻松抹掉路人甲

    外出看风景,拍张照片留纪念,却时常有路人来抢镜,相信这种纠结大家应该都有遇到过吧?或许你也曾想过很多办法,裁掉?不能消除干净又会影响构图效果.覆盖?不是面目全非就是难度太大.近日听说"美图秀 ...

  4. SNS:美图秀秀的社交化变革

    2019独角兽企业重金招聘Python工程师标准>>> 上个月,美图秀秀的新版本进行了大规模改动,宣布进军社交方向,转型工具+社交平台.最新版本直接将社区放在首页,不需要再做点击跳转 ...

  5. 美图秀秀完美消除抢镜杂物 提升画面美感

    走进大自然,轻嗅着迷人的花香.呼吸着清新的空气,目光所及之处都是怡人的景致,这就是旅游所带给人的惬意,所以我们会在旅游时,将所见的美景尽收进相机镜头留念.可是在一些风景照中,总有些杂物抢镜,真是大大降 ...

  6. 美图秀秀2015年实习生android应用开发方向招聘笔试题

    美图秀秀的实习生笔试题总体上比较简单,考察的比较基础,主要是自己比较low,有些题当时都木有做出来.下面整理了两道当时没做出来的题目. 1(JAVA题).打印九九乘法表,要求:只能使用一次for循环, ...

  7. 十行代码,我用Python做一个迷你版的美图秀秀!

    美图秀秀相信大家都不陌生,大家只要操作美图秀秀,就可以P掉图片中脸上的一些瑕疵,让人变得更加的美丽.今天小编就带领大家来借助Python和Flask来实现一个美图秀秀的网页设计,大家只需要通过网页上传 ...

  8. 教你把Python当美图秀秀用

    Python中有一个第三方图像数据库,由于其强大功能和简单易用的API几乎被认为是Python平台上的官方图像处理库了,它就是PIL(PythonImage Library). 很多人学习python ...

  9. Python 图像 一样大小_教你把Python当美图秀秀用(一)

    本文作者:钱梦璇 文字编辑:孙晓玲 技术总编:张   邯 导读 Python中有一个第三方图像数据库,由于其强大功能和简单易用的API几乎被认为是Python平台上的官方图像处理库了,它就是PIL(P ...

最新文章

  1. matlab怎么分析一段音频,Matlab分析音频
  2. 2019年东莞特长生 散步
  3. rror Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that
  4. jzoj4249-游戏【贪心】
  5. 动态创建标记+css_dom+js动态效果
  6. oracle临时表空间组,证明临时表空间组在并发session时的作用
  7. 鸿蒙电脑操作系统最新消息,5G专家预测:7年后鸿蒙将成全球第一大操作系统
  8. (后端)解决code唯一码(java)简便方法
  9. 在linux中docker安装mysql_Linux系统:用docker安装mysql。
  10. actor对自己不可见
  11. 实现简单的Java内存缓存
  12. spring-第N篇整合SSM,即Mybatis+Spring+Spring MVC
  13. 产品经理面试问题及答案大全《一》
  14. comsol 超声声场模拟_Comsol Multiphysics 声场仿真模块整体介绍
  15. php整人代码,HTML代码整人。。
  16. Unity修改编辑器
  17. Python:井字棋游戏
  18. python圣诞节快乐_圣诞节快乐,利用Python给自己的微信头像添加一个圣诞帽
  19. 兔子繁殖问题:一对兔子从出生后第三个月开始,每月生一对小兔子。小兔子到第三个月又开始生下一代小兔子。假若兔子只生不死,一月份抱来一对刚出生的小兔子,问一年中每个月各有多少对兔子(C++)(迭代法)
  20. 除中国中医药数据库官网外-必备5个其它常用中国中医药数据库

热门文章

  1. EAS BOS 序时簿动态列的实现
  2. 南京NLP算法岗中小厂汇总
  3. 福昕PDF不能标记的原因和解决方法
  4. 记,罗盘时钟使用js实现
  5. java中加减乘除优先级_java运算符优先级
  6. 图[评委计分系统-双屏标准版]用PowerPoint制作比赛评分系统,用VC++制作控制台,PPT集成技术佼佼者,国内唯一
  7. 数字图像处理:图像缩放和降低灰度级
  8. 图像去噪--代码实现
  9. 合并或注销重复领英帐号,利用领英高效开发客户技巧。置顶收藏
  10. c语言oled p14x16str,51单片机加OLED12864显示汉字遇到的奇葩现象