python legend在图像外 python做图像

admin2024-06-11  31

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

默认已经有python3.0以上和包管理工具pip3。那要执行如下命令升级pip3并安装Pillow 工具包:

sudo install -U pip3
sudo install Pillow

程序原理

根据颜色(肤色)找出图片中皮肤的区域,然后通过一些条件判断是否为色情图片。

程序的关键步骤如下:

python学习交流Q群:906715085####
1.遍历每个像素,检查像素颜色是否为肤色


2.将相邻的肤色像素归为一个皮肤区域,得到若干个皮肤区域


3.剔除像素数量极少的皮肤区域

我们定义非色情图片的判定规则如下(满足任意一个判断为真):

1.皮肤区域的个数小于3个


2.皮肤区域的像素与图像所有像素的比值小于15%


3.最大皮肤区域小于总皮肤面积的45%


4.皮肤区域数量超过60个

这些规则你可以尝试更改,直到程序效果让自己满意为止。关于像素肤色判定这方面,公式可以在网上找到很多,但是世界上不

可能有正确率100%的公式。你可以用自己找到的公式,在程序完成后慢慢调试。

python legend在图像外 python做图像,python legend在图像外 python做图像_面试,第1张

•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值按照像素坐标排布,那么看起来

如下图:

python legend在图像外 python做图像,python legend在图像外 python做图像_python_02,第2张

其实id的顺序也即遍历的顺序。遍历所有像素时,创建Skin对象后,如果当前像素为肤色,且相邻的像素有肤色的,那么我们把

这些肤色像素归到一个皮肤区域。

相邻像素的定义:通常都能想到是当前像素周围的8个像素,然而实际上只需要定义4个就可以了,位置分别在当前像素的左方,

左上方,正上方,右上方。因为另外四个像素都在当前像素后面,我们还未给这4个像素创建对应的Skin对象:

python legend在图像外 python做图像,python legend在图像外 python做图像_学习_03,第3张

python legend在图像外 python做图像,python legend在图像外 python做图像_学习_04,第4张

实现脚本

直接在python中新建nude.py文件,在这个文件进行代码编写:

导入所需要的模块:

import sys
import os
import _io
from collections import namedtuple
from PIL import Image

我们将设计一个Nude类:

class Nude:

这个类里面我们首先使用 collections.namedtuple() 定义一个 Skin 类型:

Skin = namedtuple("Skin", "id skin region x y")

collections.namedtuple() 函数实际上是一个返回 Python 中标准元组类型子类的一个工厂方法。你需要传递一个类型名和你需要

的字段给它,然后它就会返回一个类,你可以初始化这个类,为你定义的字段传递值等。详情参见官方文档。

然后定义 Nude 类的初始化方法:

python学习交流Q群:906715085###
def \_\_init\_\_(self, path_or_image):
    # 若 path\_or\_image 为 Image.Image 类型的实例,直接赋值
    if isinstance(path_or_image, Image.Image):
        self.image = path_or_image
    # 若 path\_or\_image 为 str 类型的实例,打开图片
    elif isinstance(path_or_image, str):
        self.image = Image.open(path_or_image)

python legend在图像外 python做图像,python legend在图像外 python做图像_python legend在图像外_05,第5张


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!