数字图像学笔记 —— 19.肤色检测

文章目录

  • 什么是肤色检测
  • 需要使用OpenCV函数
    • 颜色空间转换
    • 颜色范围
    • 位运算

什么是肤色检测

在没有AI之前,肤色检测是计算机视觉的一项常见任务。其根本思路是划定一个颜色区域,只要属于该颜色区域的像素就认为属于肤色。但是这种方法的精确度不高,并且常常有错误的区域被误认为皮肤。

尽管AI或者机器学习已经能够很好的从图片中识别出肤色部分。但是作为经典图像学任务,我想了想还是花点时间介绍肤色的常见识别算法。因此,在本文中我们介绍其中一种方法,将RGB图像转换到HSV色彩空间,然后在HSV空间中设置适当的阈值以检测肤色。

关于RGB转HSV颜色空间的相关算法,可以如果有需要的话,可以参考我之前写的这篇文章:《数字图像学笔记——1. 常用颜色空间转换》

请注意,这种方法可能会受到光照条件、人种、图像质量等因素的影响,可能需要进行一些调整才能在特定的应用场景中达到最佳效果。

需要使用OpenCV函数

颜色空间转换

    # Convert image to HSVhsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

这部分转化非常简单,通常只需要用 cvtColor 这个函数完成彩色RGB图片转HSV。

另一个需要用到的函数是

颜色范围

我们需要用告知OpenCV,在HSV空间,可用的肤色范围,大概是

    # Define range for skin color in HSVlower_skin = np.array([0, 20, 70], dtype=np.uint8)upper_skin = np.array([20, 255, 255], dtype=np.uint8)# Threshold the HSV image to get only skin colorsskin_mask = cv2.inRange(hsv_image, lower_skin, upper_skin)

然后使用 inRange 这样我们可以生成一个掩码,然后我们让这个掩码和原图进行位运算,于是

位运算

这里,我们用到的是 bitwise_and 函数,选取在该范围内的像素

    # Bitwise-AND mask and original imageskin = cv2.bitwise_and(image, image, mask=skin_mask)

然后把上面这些代码合在一起,得到了重要的肤色计算函数

def skin_detection(image):# Convert image to HSVhsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)# Define range for skin color in HSVlower_skin = np.array([0, 20, 70], dtype=np.uint8)upper_skin = np.array([20, 255, 255], dtype=np.uint8)# Threshold the HSV image to get only skin colorsskin_mask = cv2.inRange(hsv_image, lower_skin, upper_skin)# Bitwise-AND mask and original imageskin = cv2.bitwise_and(image, image, mask=skin_mask)return skin, skin_mask

然后我们把原图和结果都画出来,就可以得到最后的效果了。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/29181.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu中下载、构建、使用raylib

目录 先决条件 [1]下载raylib方式一方式二 构建 [1]使用终端中使用Clion中使用 先决条件 [1] ubuntu系统上需要先安装GCC, make(或者cmake)和git (下载raylib) 执行下面的命令可以安装GCC,make,cmake,git sudo apt install build-essential git #build-essential是一套工具集…

leetcode 445. Add Two Numbers II(两数相加)

用链表代表2个数字,这2个数字相加的和用链表返回。 最高位在链表的head. 思路: 1.链表逆序 数字相加是从低位到高位的,然而链表中的数字是从高位指向低位。 所以涉及到链表的逆序。 逆序之后只需从head到tail把两个链表的数字相加&#x…

Windows安装激活注意事项

选择语言、版本(Windows 10指的是专业版本)和体系结构(32位/64位),这里自行根据情况选择(如果机器预装的是Windows 10家庭中文版则选择家庭中文版,如果预装的是专业版则选择Windows 10。这样原先…

使用IDEA构建jar然后转执行程序exe的爬坑

https://download.csdn.net/download/leoysq/87939492 构建jar

划片机的作用将晶圆分割成独立的芯片

划片机是将晶圆分割成独立芯片的关键设备之一。在半导体制造过程中,晶圆划片机用于将整个晶圆切割成单个的芯片,这个过程被称为“晶圆分割”或“晶圆切割”。 晶圆划片机通常采用精密的机械传动系统、高精度的切割刀具和先进的控制系统,以确保…

018 - STM32学习笔记 - SPI读写FLASH(三)- 写入字符串、小数与整数

018 - STM32学习笔记 - SPI访问Flash(三)- 写入字符串、小数与整数 上节对Flash的跨页写入数据进行了完善,但是数据写入都是以Byte数组的方式进行写入,这节分别进行字符串的写入和小数整数的写入,本节内容对SPI的函数…

Storage、正则表达式

1 LocalStorage 2 SessionStorage 3 正则表达式的使用 4 正则表达式常见规则 5 正则练习-歌词解析 6 正则练习-日期格式化 Storage-Storage的基本操作 // storage基本使用// 1.token的操作let token localStorage.getItem("token")if (!token) {console.log(&q…

Spring的创建和使用

目录 Spring的创建1.创建一个普通的Maven项目2.添加spring框架支持3.添加启动类 存储Bean对象1. 创建Bean2.将Bean注册到容器当中 获取并使用Bean对象1.得到Spring上下文2. 获取指定Bean对象3. 使用Bean对象 总结 Spring 是⼀个包含了众多⼯具⽅法的 IoC 容器。那么它就具备以下…

CloudCompare——M3C2计算两点云之间的鲁棒距离

目录 1.概述2、计算原理3、操作流程 本文由CSDN点云侠原创,原文链接。爬虫网站请自重。 M3C2 (plugin) 1.概述 CloudCompare中的Plugins -> M3C2 Distance 功能是用来计算两组点云间的鲁棒距离的特别方法。从CloudCompare-2.9版开始,M3C2插件还包括…

隐私计算大会亮点前瞻:《隐私计算应用研究报告(2023年)》发布预告

7月26日,2023隐私计算大会将于青岛正式扬帆,本次大会将齐聚业内专家大咖共论行业最新进展,洞察未来发展趋势,共同推进隐私计算行业蓬勃发展。 本次大会将公开正式发布《隐私计算应用研究报告(2023)》、“隐…

leetcode 9 回文数

class Solution {public boolean isPalindrome(int x) {if(x < 0){return false;}int num x;int value 0;while(num > 0){value value * 10 num % 10;num num / 10;}return value x;} }

阿里云RockMQ与SpringBoot的整合

前言&#xff1a; 开源版本Rocket和商业版本的RocketMQ有些不同&#xff0c;研究的是商业版本的RocketMQ&#xff0c;阿里云的官方文档&#xff0c;感觉有点乱。看不咋明白&#xff0c;网上虽然有教程&#xff0c;大都还是有点缺少&#xff0c;有时候会突然跳了步骤&#xff0c…