Python 去除单色背景
白色背景的去除比较简单,直接比较RGB颜色就可以了。但是单色背景直接用RGB比较可能存在一些问题。这就涉及到近似颜色判断的问题。
- 颜色定义
我们最常见到的颜色定义是RGB模式。RGB分别代表红色、绿色和蓝色。三种颜色混合在一起,就可以表示多种颜色。这种方法有一个很大的问题,当一个分量发生改变的时候,很可能颜色也发生了改变。用RGB来直接判断颜色近似程度是非常困难的。如果要实现,估计也是非常复杂的。
除了RGB,还有两种颜色表示方法:HSV和LAB。
HSV也是三个分类,H表示色调,S表示饱和度,V表示亮度。HSV的定义与描述大家可以在网络上找。很多Python关于图形处理的软件包都要RGB与HSV之间转换的方法。
另外一种方法叫LAB方法,此方法是基于人类眼睛对于颜色的感知。L表示亮度,A表示红绿色差,B表示蓝黄色差。
此种方法可以比较方便的表示颜色的近似程度。具体的方法可以参考颜色近似度判断方法
上面为三种颜色表示方法的说明。可以发现RGB是个立方体,HSV是个圆柱,而LAB是球状模型。球状模型是最好计算颜色近似程度。立方体和圆柱体都不是特别好计算,特别是立方体。
2. 近似颜色
近似颜色的三分实现如下:
def color_dist_2(color1, color2):r1, g1, b1 = color1[0:3]r2, g2, b2 = color2[0:3]rmean = (r1 + r2) / 2R = r1 - r2G = g1 - g2B = b1 - b2return math.sqrt((2. + rmean / 256.) * (R ** 2.) + 4. * (G ** 2.) + (2. + (255 - rmean) / 256) * (B ** 2))
这个方法就是上面的参考链接中提供的。不过在实践中可以使用下面这个函数,它的运算效率大概比上一种方法高20%左右:
def color_dist(color1, color2):r1, g1, b1 = color1[0:3]r2, g2, b2 = color2[0:3]rmean = int((r1 + r2) / 2)R = r1 - r2G = g1 - g2B = b1 - b2return math.sqrt((((512+rmean)*R*R)>>8) + 4*G*G + (((767-rmean)*B*B)>>8))
有了计算颜色近似度的算法,就好实现去除单一背景色了。程序如下:
from PIL import Image
import mathdef color_dist_2(color1, color2):r1, g1, b1 = color1[0:3]r2, g2, b2 = color2[0:3]rmean = (r1 + r2) / 2R = r1 - r2G = g1 - g2B = b1 - b2return math.sqrt((2. + rmean / 256.) * (R ** 2.) + 4. * (G ** 2.) + (2. + (255 - rmean) / 256) * (B ** 2))def color_dist(color1, color2):r1, g1, b1 = color1[0:3]r2, g2, b2 = color2[0:3]rmean = int((r1 + r2) / 2)R = r1 - r2G = g1 - g2B = b1 - b2return math.sqrt((((512+rmean)*R*R)>>8) + 4*G*G + (((767-rmean)*B*B)>>8))imgPath = "d:\\green.jpg"
img = Image.open(imgPath) # 读取照片
img = img.convert('RGBA')
width = img.size[0]
height = img.size[1]
color = [255, 255, 255] # 白色阈值
pixel = img.load()
color_delta = 150. # 2个颜色之间的差距。可以动态调整for i in range(0, width):for j in range(0, height):data = list(pixel[i, j])if color_dist_2(data, color) < color_delta:img.putpixel((i, j), (0, 0, 0, 0))
img.show()
这里面最难的就是定义颜色近似度的范围。需要各位根据实际图片的情况进行设置。不过针对单一颜色,一般在256以内问题都不大。
【图片来自于https://blog.csdn.net/wsp_1138886114/article/details/80660014】
Python 去除单色背景相关推荐
- 用Python去除扫描型PDF中的水印
内容概述 含水印扫描型PDF文件,其中某页如下图所示,用Python去除其页顶及页底的水印. 处理思路:PDF中的每一页的水印的相对位置基本相同,将PDF每一页输出成图片,然后进行图片编辑,用白色填充 ...
- python去除php、java、js、html、vue等类型注释字符方法实例
本篇文章主要讲解:python去除php.java.js.html.vue等所类型注释字符方法实例 作者:任聪聪 可以处理php.java.python.js.html.vue.node.mysql等 ...
- python运行界面黑色_selenium+python 去除启动的黑色cmd窗口方法
其实 selenium启动窗口的时候就是 使用了subprocess.Popen 启动的驱动程序的,只要在启动的时候加上启动不显示窗口的参数即可. 下面魔改开始O(∩_∩)O哈哈~ 修改代码 位于D: ...
- python黑色背景白色背景_用Python去除图像的黑色或白色背景实例
用Python去除背景,得到有效的图像 此目的是为了放入深度学习计算中来减少计算量,同时突出特征,原图像为下图,命名为1.jpg,在此去除白色背景,黑色背景同理 需要对原图像进行的处理是去掉白色背景, ...
- python去除字符串中表情字符
python去除字符串中表情字符 用mysql存储数据时,"charset=utf8"默认状态下text字段不支持4字节的字符,而表情字符为4字节,如果表情字符非所需数据时可以将其 ...
- python去除空行_python中去掉空行的问题
在python中处理空行时,经常会遇到一些问题.现总结经验如下: 1.遇到的空行如果只有换行符,直接使用=='\n'或者 len(line)==line.count('\n') 2.有多个空格+换行符 ...
- 用Python去除图像的黑色或白色背景
用Python去除背景,得到有效的图像 此目的是为了放入深度学习计算中来减少计算量,同时突出特征,原图像为下图,命名为1.jpg,在此去除白色背景,黑色背景同理 需要对原图像进行的处理是去掉白色背景, ...
- Python 去除图片中多种颜色或者单一颜色
Python 去除图片的多种颜色,黑色除外(黑色为单一颜色,可以参考去除单一颜色进行识别,统计占比等等),代码如下: import cv2image = cv2.imread("D:\\CS ...
- 用Python去除PDF水印尝试
文章目录 前言 一.PDF文件 二.思路整理 1.分割图片 2.去除水印 3.替换图片 三.实现效果 四.代码实现 总结 前言 最近在下载PDF书籍的时候,发现有些PDF有水印,于是就寻思着能不能用P ...
- 用 Python 去除 PDF 水印,你学会吗?
今天介绍下用 Python 去除 PDF (图片)的水印.思路很简单,代码也很简洁. 首先来考虑 Python 如何去除图片的水印,然后再将思路复用到 PDF 上面. 这张图片是前几天整理<数据 ...
最新文章
- svn教程----示例二:测试人员拥有读权限
- 【图】一只Android开发程序猿对IMの所有痴情,你会懂?
- 使用selenium爬取某东的手机商品信息
- springboot hibernate 缓存不更新_spring boot 整合 ehcache
- 【MySQL】数据库事务处理---MySQL
- vc++2010注册表修改
- 固定资产管理系统如何解决企业固定资产管理混乱的问题?
- word如何导出PDF格式
- poe工业以太网交换机可以当普通交换机用吗,poe工业以太网交换机有哪些优势
- jmeter 导入java,JMeter导入自定义的Jar包的详解教程
- 基于java斗地主_码云推荐开源项目丨 用 Java 写了一个控制台玩的斗地主
- linux chmod 777 dev,linux命令中chmod 777 以及drwxr-xr-x分别代表什么意思
- Cisco Packet Tracer的基本应用
- 什么是方法的重载?(Java)
- 并行多核体系结构基础 Yan Solihin 第4章 针对链式数据结构的并行 摘录
- 如何发现「将死」的ReLu?可视化工具TensorBoard助你一臂之力
- 支持手机,滑动拖动验证
- Facebook创始人解释为何不把公司交给职业经理
- 佛说:有人伤害你,是来渡你的
- 云深处科技推出国内首款IP66工业级防水机器狗“绝影X20”