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

原创 2008年10月28日 14:13:00

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),着实令人吃惊。

 

 

来自网易新闻的图片

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

xclip_image001clip_image002clip_image003

相应的图片处理后的结果是:

clip_image004clip_image005clip_image006

可见简单的肤色模型已经能够工作得很好。

接下来就可以写统计肤色像素的代码了,很短,只有 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# 都能很方便地写出来,当然,也可以很方便地删除。哈哈。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

如何用python编写一个绘制马赛克图像的自写程序mask = np.zeros

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。 这篇教程将会展示如何用python的图形化包“Pygame”和基础的文件I/O来创建一个自写程序。这个程...
  • c2a2o2
  • c2a2o2
  • 2017年04月28日 09:40
  • 747

Python: PS 滤镜--马赛克

本文利用 Python 实现PS 滤镜中的马赛克效果,具体的算法原理和效果可以参考之前的博客: http://blog.csdn.net/matrix_space/article/details/3...

基于opencv的相机之马赛克功能实现(九)

简介   本篇是对实现图片处理功能:【马赛克】实现的记录。 实现原理   在点击进入该功能之后,首先便初始化生成一份马赛克图片。当用户在图片上滑动时候,用掩码图片记录当前划过的位置;当用户抬起手指...

Python学习班微分享实录:用Python实现Mosaic Photo

本文基于CSDN Python学习班微分享内容整理,主要讲解了如何通过Python程序实现Mosaic Photo效果。主讲人陈舸,8年开发经验,曾就职华为、烽火通信,目前创业中。《Python Co...

Python 3 色情图片识别

Python 3 色情图片识别 一、实验简介 本实验将使用 Python3 去识别图片是否为色情图片,我们会使用到 PIL 这个图像处理库,会编写算法来划分图像的皮肤区域 1.1. ...

python socket(二)接收多个消息

在python socket(一)中,客户端每次只能发送一次消息,然后连接就断开。 把客户端修改一下,加入一个循环就能让它发送多个消息和接收。 server端代码: # -*- coding: utf...

Python处理二进制结构化数据时的技术细节

处理二进制文件或者从网络接收字节流时,字节流中的结构化数据可能存在二进制有符号数。虽然开发者根据字节流协议可以先验的知道有符号数的字节序、字长、符号位等信息,但在使用Python进行类型转换时缺少将这...

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

10 行代码判定色*情*图片——Python 也可以系列之二 作者:赖勇浩(http://blog.csdn.net/lanphaday) 致编辑:我已经给图片打上马赛克了,别再删除了啊,我这是纯...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(已加马赛克)10 行代码判定色*情*图片——Python 也可以系列之二
举报原因:
原因补充:

(最多只允许输入30个字)