PYTHON的PIL和Counter实现过滤大部分空白背景的图片

需求

有以下三张图,目标是筛选出img2,排除掉img1和img3。


最初考虑过用for循环遍历每一个像素值,然后对空白像素值进行统计,占比达到总像素点的一定百分比就过滤掉,但是这样会大大的增加计算量,于是打算另辟蹊径。。

准备

用到的函数有:

  1. Image中的getdata(),它能直接获取图像的像素值,并且每个像素点的四个像素值以元组的形式呈现。getdata()有band参数,默认band是所有,当band=0时,仅返回‘r’ band,即只返回RGB中的R值。
  2. collections中的Counter,他可以对列表中的元素进行计数,其中的max_common(n)可以返回前n个计数最多的元素。

基本思路

首先获取图像的像素值,然后用max_common获取该图像的计数前几的像素值大小,若前几的像素值均大于200,那么说明这个图像空白值占绝大多数,从而实现过滤。

实现

from PIL import Image
import numpy as np, pandas as pd
from collections import Counter
img1 = Image.open('E:\\tensor\\pycharm\\img procession\\LUAD_cropped\\LUAD_15.png')
img2 = Image.open('E:\\tensor\\pycharm\\img procession\\LUAD_cropped\\LUAD_16.png')
img3 = Image.open('E:\\tensor\\pycharm\\img procession\\LUAD_cropped\\LUAD_23.png')
img_lis = ['img1', 'img2', 'img3']
for i in img_lis:print(list(eval(i).getdata()))


通过观察像素值可以发现三个图像的像素点的最后一个像素值均为255(猜测这个值应该是图像的透明度,忽略它即可)

for i in img_lis:im1 = Counter(np.array(eval(i)).flatten()).most_common(3)print(im1)

接下来对像素值进行统计,这里需要注意的是Counter技术的对象必须是列表,所以可以通过np.array先转化为ndarray类型,再调用array的flatten()函数将array转化为一维,然后统计计数前3的像素值。
在这里插入图片描述](https://img-blog.csdnimg.cn/20200508222306100.jpg#pic_center)
元祖中第一个值为像素值,第二值为该像素值的数量。毫无疑问,计数第一的是255像素值,因为它在每个像素点中都存在,那么我们需要关注的就是第二个像素值了。我们可以发现只有第二个图片的计数第二的像素值是小于200,说明该图片的非空白面积很小。
接下来只需要对改值进行判断即可,即取列表中第二个元组中的第一个值 。

python
for i in img_lis:if Counter(list(eval(i).getdata())).most_common(3)[1][0] > 200:  print('过滤该图像') # 当然后面可以进行其他操作

我们继续来测试一下下面这张图片


结果如下
发现这种手段也会过滤掉空白占比大于50%左右的图像,那么假如我们要保留它该怎么做呢?
可以取计数更后面的数值

就这张图片而言,从上面的结果看,可以取第9个值。当然不具有普适性。
这种方法的缺点就是不够精确。在要求不高的情况下可以选择该方法。

用python实现过滤存在大部分空白背景的图片相关推荐

  1. Python批量裁剪图形外围空白区域-续

    一.基本描述 批量裁剪掉图片的背景区域,一般是白色背景,从而减少背景值的干扰和减少存储空间. 原文链接:Python批量裁剪图形外围空白区域 原文是通过检索所有图片的最小裁剪区域坐标值,然后再对图片进 ...

  2. 用Python爬网页需要了解什么背景知识

    在知乎上有一位同学提出的问题:用Python爬网页需要了解什么背景知识,恰好我对爬虫有所了解,所以昨天晚上做了回答,今天放到公众号上面希望对大家有所帮助,如有帮助欢迎转发. 文中涉及到一些教程链接在本 ...

  3. Python:绘图保存时出现空白图像的解决和如何保存图片

    QUESTION:Python:绘图保存时出现空白图像的解决和如何保存图片? ANSWER: 保存图片的代码: plt.savefig("test1.png") 保存要在显示图形前 ...

  4. python字符串筛选输出_如何在Python中过滤字符串列表

    Python使用列表数据类型在顺序索引中存储多个数据.它的工作方式类似于其他编程语言的数字数组.filter()方法是Python的一种非常有用的方法.可以使用filter()方法从Python中的任 ...

  5. python协同过滤调用包_简单的python协同过滤程序实例代码

    本文研究的主要是python协同过滤程序的相关内容,具体介绍如下. 关于协同过滤的一个最经典的例子就是看电影,有时候不知道哪一部电影是我们喜欢的或者评分比较高的,那么通常的做法就是问问周围的朋友,看看 ...

  6. python过滤敏感词汇_利用Python正则表达式过滤敏感词的方法

    利用Python正则表达式过滤敏感词的方法 问题描述:很多网站会对用户发帖内容进行一定的检查,并自动把敏感词修改为特定的字符. 技术要点: 1)Python正则表达式模块re的sub()函数: 2)在 ...

  7. PYthon调整音乐音量,生成空白音乐

    PYthon调整音乐音量,生成空白音乐 使用情景 代码 使用情景 做短视频编辑的时候,有时候需要调节音频的音量,以下代码可以解决,直接上代码. 代码 from moviepy.editor impor ...

  8. python轻松过滤处理脏话与特殊敏感词汇的方法

    导读 我们开发的系统往往都离不开信息的处理,这些信息有的内容非常敏感,就需要过滤掉不容许出现 python的其中一个强大之处就是它可以方便的集成很多的非标准库,今天在GitHub上溜达又发现了一个脏话 ...

  9. 【基于python协同过滤的新闻推荐系统-哔哩哔哩】 https://b23.tv/VkBJ8KZ

    [基于python协同过滤的新闻推荐系统-哔哩哔哩] https://b23.tv/VkBJ8KZ https://b23.tv/VkBJ8KZ

最新文章

  1. group by 字句的扩展+rollup字句+cube字句+grouping()函数
  2. spring 定时器设置停止_单片机MSP430入门-理论⑦--定时器模块-定时器A②
  3. 算法设计:UNION-FIND算法实现
  4. snort3安装教程
  5. Java ArrayList 为什么要实现 RandomAccess 接口?
  6. 绘制方法太单一!?这三个宝藏在线学习资源推荐给你~~
  7. JFinal问题整理
  8. 浪潮服务器测试文档,ESXI6.7注入浪潮服务器raid驱动测试
  9. Windows漏洞:MS08-067远程代码执行漏洞复现及深度防御
  10. 连接Android与ASP.NET Core Web API的完整教程
  11. mod sim tcp配置_ModSim32和ModScan32两种Modbus调试工具使用说明
  12. Mathematica处理高斯光束的分布图像
  13. 为IDEA配置maven镜像
  14. python中pow_Python中float的内置pow()和math.pow()之间的区别?
  15. CodeForces - 985A Chess Placing(水)
  16. LESS与SASS的伯与仲
  17. 色彩的全方位运用-张聪-专题视频课程
  18. java 观察者模式讲解_java观察者模式详解
  19. 利用Python做一个简单的打印店计费程序
  20. JavaScript 设计模式之发布-订阅模式(下)

热门文章

  1. 数据库 和 数据仓库
  2. 毕业设计智慧停车场--车牌识别树莓派环境搭建
  3. 怎么在Excel中准确提取出姓名中的姓氏
  4. vue项目接入阿里云智能验证
  5. Mac将应用程序及其数据移到外接硬盘的步骤 #替身 #软链接
  6. 紫光信息港 软件测试,紫光展锐 信息化软件工程师面经
  7. 分库分表的 9种分布式主键ID 生成方案
  8. 网络信息安全管理要素和安全风险评估
  9. [week15] C - ZJM与纸条(选做)—— KMP算法
  10. Document-Level Relation Extraction with Adaptive Thresholding and Localized Context Pooling