本课程由FrostSigh发布在实验楼,完整教程及在线练习地址:Python3 色情图片识别
本实验将使用 Python3 去识别图片是否为色情图片,我们会使用到 PIL 这个图像处理库,会编写算法来划分图像的皮肤区域
PIL 2009年之后就没有更新了,也不支持 Python3 ,于是有了 Alex Clark 领导的公益项目 Pillow,Pillow 是一个对 PIL 友好的分支,支持 Python3,所以我们这里安装的是 Pillow,其官方文档
安装前更新源
$ sudo apt-get update
安装 Python 开发环境
$ sudo apt-get install python3-dev python3-setuptools
然后安装 Pillow 依赖包
$ sudo apt-get install libtiff5-dev libjpeg8-dev zlib1g-dev \
libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk
安装 pip3
,pip
是 Python2 的软件包管理系统,使用它来安装 Python2 的模块非常简便,而 pip3
则是对应于 Python3 的版本
$ sudo apt-get install python3-pip
最后安装 Pillow
$ sudo pip3 install Pillow
本程序根据颜色(肤色)找出图片中皮肤的区域,然后通过一些条件判断是否为色情图片
程序的关键步骤如下
我们定义非色情图片的判定规则如下(满足任意一个判定为真):
这些规则你可以尝试更改,直到程序效果让你满意为止
关于像素肤色判定这方面,公式可以在网上找到很多,但世界上不可能有正确率 100% 的公式
你可以用自己找到的公式,在程序完成后慢慢调试
RGB 颜色模式
第一种:r > 95 and g > 40 and g < 100 and b > 20 and max([r, g, b]) - min([r, g, b]) > 15 and abs(r - g) > 15 and r > g and r > b
第二种:nr = r / (r + g + b), ng = g / (r + g + b), nb = b / (r +g + b)
, nr / ng > 1.185 and r * b / (r + g + b) ** 2 > 0.107 and r * g / (r + g + b) ** 2 > 0.112
HSV 颜色模式
h > 0 and h < 35 and s > 0.23 and s < 0.68
YCbCr 颜色模式
97.5 <= cb <= 142.5 and 134 <= cr <= 176
一幅图像有零个到多个的皮肤区域,程序按发现顺序给它们编号,第一个发现的区域编号为 0,第 n 个发现的区域编号为 n-1
我们用一种类型来表示像素,我们给这个类型取名为 Skin
,包含了像素的一些信息:唯一的 编号(id
),是/否肤色(skin
),皮肤区域号(region
),横坐标(x
),纵坐标(y
)
遍历所有像素时,我们为每个像素创建一个与之对应的 Skin
对象,并设置对象的所有属性
其中 region
属性即为像素所在的皮肤区域编号,创建对象时初始化为无意义的 None
关于每个像素的 id 值,左上角为原点,像素的 id 值按像素坐标排布,那么看起来如下图
其实 id 的顺序也即遍历的顺序
遍历所有像素时,创建 Skin
对象后,如果当前像素为肤色,且相邻的像素有肤色的,那么我们把这些肤色像素归到一个皮肤区域
相邻像素的定义:通常都能想到是当前像素周围的 8 个像素,然而实际上只需要定义 4 个就可以了,位置分别在当前像素的左方,左上方,正上方,右上方;因为另外四个像素都在当前像素后面,我们还未给这4个像素创建对应的 Skin 对象
三、实验内容
本项目的详细教程和完整代码,可在实验楼中查看并在线完成,立即【开始实验】
更多Python经典项目:Python全部 - 课程
如果您也想通过实验楼课程的形式分享自己的实践经验,欢迎投稿给我们:项目投稿通道
2024 - 快车库 - 我的知识库 重庆启连科技有限公司 渝ICP备16002641号-10
企客连连 表单助手 企服开发 榜单123