目的


需要提取出图中的数字,但是图中数字受到两种背景色的影响,因此需要先将其去掉。

实现

方法一(直接对数组操作)

首先按照官网示例看看图片的基本信息。

from PIL import Image
im = Image.open("xxx.jpg")
print(im.format, im.size, im.mode)

分别打印出图片的格式,尺寸,颜色模式如下:

JPEG (144, 231) RGB

图片是RGB模式也就意味着图片包含三个通道的信息,我们实际要处理的是231(高度)x144(宽度)x3(R,G,B)的数组。那么接下来以数组的形式读取:

import numpy as np
arr = np.array(im,dtype=int) #像素值默认为ubyte,范围为0-255,做加减会溢出

这里需要注意如果不写dtype=int在可能的加减运算中会有溢出警告提示,虽然在这里无加减,但为了规范,统一int导入utype导出。
随意打印几个特殊点的像素值进行分析:

print(arr[52][71])   #162,223,224
print(arr[181][56])  #224,159,223
print(arr[82][33]) #0,2,5




这里推荐进去左下选图片拾色,在线查看图片各点像素值。可以发现黑色的RGB值都很低,而其他两种颜色的RGB值较高。我们选取R通道进行操作:

for x in range(0,arr.shape[0]):for y in range(0,arr.shape[1]):if arr[x][y][0]>128:arr[x][y]=255

遍历所有像素值,一旦R通道值大于128,则将其RGB三通道值变为255,也就是纯白。

new_im = Image.fromarray(arr.astype(np.ubyte))
new_im.show()

将数组以之前说的ubyte形式导出至Image对象,并显示处理后的图片。

// A code block
var foo = 'bar';


可以发现两种颜色基本被去掉,但有边角残余,完美主义者是不能接受的。

img = new_im.convert('1')
img.show()

再调用convert方法转换二值化。

可以发现残余被去掉了,但这样太麻烦了,能不能直接调用convert方法一步到位呢?

方法二(调用convert+操纵数组)

实际上调用convert方法也有两种实际上的操作,先讲复杂的。

im = im.convert('L')
im.show()

L代表灰度模式,1代表二值化(0和1)模式。为加深理解,这里先转化为灰度模式:

还是和之前一样变为数组导入,此时由于是灰度模式,会发现我们的数组维度变成了(231,144),没有三通道信息,和先前一样把大于128的值变为255。

import numpy as np
arr = np.array(im,dtype=int)
for x in range(0,arr.shape[0]):for y in range(0,arr.shape[1]):if arr[x][y]>128:     #此时没有了第三个维度[0]arr[x][y]=255
new_im = Image.fromarray(arr.astype(np.ubyte))
new_im.show()


先灰度再对数组进行操作就没有那些残余了。当然,还有更简单的方法。

方法三(一步到位convert)

肯定有人会和我一样的想法,为什么不直接二值化呢?让我们看看结果:

img = im.convert('1')
img.show()


为什么会有这么多点?不是把128以上的变成白,128以下的变成黑了吗?难不成背景颜色中的值其实相差很大?
其实,这是默认算法中的Floyd-Steinberg dither(弗洛伊德-斯滕伯格抖动)算法的影响。简单理解就是把该点的像素抖动到了附近的点上,原因是我们的人眼是对一个区域做出反应,所以该算法有助于降低图像的损失,但显然这是我们不需要的

img = im.convert('1',dither=Image.NONE)
img.show()

img = im.convert('1',dither=Image.FLOYDSTEINBERG)
img.show()


真相大白了。原来是里面的dither参数有两个值可以接受,
一是Image.NONE,二是Image.FLOYDSTEINBERG。
默认的是带抖动的。
其实这里官方文档也写的不清楚,API里写的默认是dither=None。然后我把None填入发现没有变化,其实是Image.NONE注意是全部大写的NONE

总结

现在最大的感受就是一个库的官方教程都是虚的,把这些东西搬运来搬运去没有什么价值,只有进行实践才会发现有许多值得探索和注意的地方,即需要在看API的同时多敲代码。

Pillow库学习笔记之Image.convert去底色详解相关推荐

  1. Python pillow库学习笔记

    Python pillow库学习笔记 PIL( Python Imaging Library)是 Python 的第三方图像处理库,由于其功能丰富,API 简洁易用,因此深受好评. 自 2011 年以 ...

  2. 【相机标定与三维重建原理及实现】学习笔记1——相机模型数学推导详解

    目录 前言 一.小孔成像模型 二.坐标系的变换 1.世界坐标系到相机坐标系的变换(刚体变换)[xw^→xc^\boldsymbol {\hat{x_{w}}}\rightarrow \boldsymb ...

  3. SNMP学习笔记之SNMP 原理与实战详解

    原文地址:http://freeloda.blog.51cto.com/2033581/1306743 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法 ...

  4. 【学习笔记】sed 命令及参数详解

    sed 命令及参数详解 标签:Sed 文章目录 sed 命令及参数详解 一.简介 二.基本用法 2.1. 三种方式 2.2. 常用选项 2.3. 命令体的组成 2.3.1. 定位文本部分 2.3.2. ...

  5. RT-Thread学习笔记|TCS34725 RGB 颜色识别传感器详解

    rt-thread是什么? RT-Thread 是一个集实时操作系统(RTOS)内核.中间件组件和开发者社区于一体的技术平台,组件完整丰富.高度可伸缩.简易开发.超低功耗.高安全性的物联网操作系统.R ...

  6. Nginx模块Lua-Nginx-Module学习笔记(二)Lua指令详解(Directives)

    源码地址:https://github.com/Tinywan/Lua-Nginx-Redis Nginx与Lua编写脚本的基本构建块是指令. 指令用于指定何时运行用户Lua代码以及如何使用结果. 下 ...

  7. 【STM32学习笔记】(1)—— STM32详解

    什么是STM32 STM32的字面含义: 1.ST-代表着意法半导体公司,即由什么公司生产. 意法半导体公司是一家SOC厂商,所谓SOC(System-on-a-Chip),根据它的中文意思可以知道& ...

  8. HTML学习笔记3:HTML基本骨架详解

    在HTML笔记1中,我简单介绍了HTML抽象的基本框架,其实,HTML的基本骨架部分还有更多内容需要了解,这一节,咱们就详细学习HTML的基本骨架. 打开sublime编辑器,输入html:xt 图1 ...

  9. 吴恩达深度学习笔记(114)-RNN梯度消失问题详解

    https://www.toutiao.com/a6652968074712449550/ 2019-02-10 14:34:53 循环神经网络的梯度消失(Vanishing gradients wi ...

最新文章

  1. 如何计算服务限流的配额
  2. 爸爸和无我编程十条诫律
  3. OpenCV检测拐角detecting corners的实例(附完整代码)
  4. 自动增益(AGC)算法FPGA实现
  5. 【开发者portal在线开发插件系列三】字符串 及 可变长度字符串
  6. 1000道Python题库系列分享21(11道编程题:内置函数专项练习)
  7. 搜索系统中的纠错问题
  8. 谈一谈|如何写好一篇博客
  9. 输出数组元素(c语言)
  10. Linux如何切换字符或者图形界面
  11. drupal 7宝典_为Drupal 7建立新主题
  12. 光学基本知识--概念辨析
  13. 企业纯内网二进制完美部署Docker(20.10.7版本)
  14. 国庆第七天的一些杂感
  15. GB28181 协议实现H5无插件RTMP/HTTP-FLV/HLS直播监控方案 - sfxlab
  16. 数据结构-图(图的定义、分类、基本术语和存储结构)
  17. 八卦:大量放送Gmail,Orkut,Wallop的邀请函
  18. 7-9 彩虹瓶 (25 分)(c++)
  19. 疑似STM32CAN进入bus off 模式
  20. 程序人生 - 西瓜霜能吃下去吗?

热门文章

  1. CF-940-F. Machine Learning【带修莫队】
  2. 湖南省常德市谷歌高清卫星地图下载
  3. 阴天(唐伯虎点秋香版)3铃声 阴天(唐伯虎点秋香版)3手机铃声免...
  4. how2j网站前端项目——天猫前端(第一次)学习笔记4
  5. linux open驱动失败,linux所遇到的问题记录
  6. 【花雕动手做】有趣好玩的音乐可视化系列项目(24)--无限LED镜子灯
  7. K8S(Rancher)Ingress 规则 - Nginx 反向代理重定向
  8. Java实现导出内容为PDF格式
  9. Python 下标异常
  10. 关于目标跟踪SiamMask的Youtube-VOS 数据库下载