设为首页 收藏本站
查看: 1667|回复: 0

[经验分享] (已加马赛克)10 行代码判定色*情*图片——Python 也可以系列之二

[复制链接]

尚未签到

发表于 2017-5-8 11:23:05 | 显示全部楼层 |阅读模式
10 行代码判定色*情*图片——Python 也可以系列之二
  作者:赖勇浩(http://blog.csdn.net/lanphaday)
致编辑:我已经给图片打上马赛克了,别再删除了啊,我这是纯技术贴!
  声明:本文因科学研究需要,包含部分色*情*图片,不可作为传播色*情*信息的证据。
  今天先是在 CSDN 看到《大学生发明依据皮肤比例过滤色*情*图片软件》(http://news.csdn.net/n/20081028/120298.html),后来发现这条新闻竟然已经上了网易新闻频道了(http://news.163.com/08/1028/05/4PAORMQB00011229.html),着实令人吃惊。
DSC0000.jpg

  来自网易新闻的图片
  根据作者的话说:“这个软件的原理在于通过计算面部、四肢图像区域,与整个肤色区域的面积比例和具体的分布,来判断网站中是否含有色*情*图片。”我估计他用的就是普通的肤色模型对图片的像素进行检测和统计,最多加上一些色块的分布、形状等数据进行一些条件过滤。于是我就写了段代码来分析图像,把图像中非肤色的像素去除,效果如下(声明:程序计算的数据是根据未打马赛克的图片计算的,因为保持 CSDN 博客的需要,故打上马赛克再发表):
  x
  相应的图片处理后的结果是:

  可见简单的肤色模型已经能够工作得很好。
  接下来就可以写统计肤色像素的代码了,很短,只有 10 行,充实体现了 Python 语言的强大,以及李济民同学的研究并不深入:
  import sys, Image
  img = Image.open(sys.argv[1]).convert('YCbCr')
  w, h = img.size
  data = img.getdata()
  cnt = 0
  for i, ycbcr in enumerate(data):
  y, cb, cr = ycbcr
  if 86 <= cb <= 117 and 140 <= cr <= 168:
  cnt += 1
  print '%s %s a porn image.'%(sys.argv[1], 'is' if cnt > w * h * 0.3 else 'is not')
  下面简单讲解一下代码:
  1) Image 是 PIL 库,我曾经写过一篇《用Python做图像处理》(http://blog.csdn.net/lanphaday/archive/2007/10/28/1852726.aspx),基本用法可以参考此文。
  2) img = Image.open(fn).convert('YCbCr'),这一行打开从命令行传入的文件名,然后转换到 YCbCr 色彩空间,关于 YCbCr 的理论知识,可以参考http://baike.baidu.com/view/564370.htm。
  3) data = img.getdata(),这一句是为了方便快速操作像素而获取图像数据
  4) if 86 <= cb <= 117 and 140 <= cr <= 168:,这一句最为重要,是本文的精髓所在。根据 YCbCr 肤色模型,许多论文推荐用 86 <= cb <= 127,130 <= cr < 168,但经实验,这个数值并不好,所以我把 cb 的上限改为 117,cr 的下限改为 140,过滤掉太白和太黑的部分。
  最后本程序的执行结果是这样的:
  E:\>c:\python25\python test_skin.py 114.jpeg
  114.jpeg is a porn image.
  其中 114.jpeg 就是上例中的第三幅图片。
  综上所述,重庆邮电大学的大四学生李济民,只不过是利用了一个非常成熟的理论(肤色检测是人脸识别等计算机视觉学科的基础知识),写了一点点代码(也许他用 C++ 写的代码比我用 python 写的多一些,但最多也就多三两百行),并没有实质性的科研突破,产品也不够成熟(按他的话就是比*基*尼美女都识别不了),记者和网站对他进行宣传,实为棒杀。
  另,许多 CSDN 的网友对他用的“嵌入浏览器内,很难删除”的说法很好奇,在这里顺便提一下李同学应该是用 Browser Helper Object,又称 BHO 技术来完成这件事的,这是一个很简单的技术,查查 MSDN,用 VC/VB/C# 都能很方便地写出来,当然,也可以很方便地删除。哈哈。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-374628-1-1.html 上篇帖子: 模块文本Python Rapid GUI Programming 第二篇。 30行写一个更奇葩的计算器。Python 基础教程 模块文本 下篇帖子: 了不起的盖茨比读后感---Java程序员学Python学习笔记(二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表