使用Python检测图像是彩色、灰度还是黑白

2024-01-17

我从 jpeg 格式的 PDF 文件中提取页面图像,我需要确定每个图像是否更灰度、彩色或黑白(具有容差因子)。

我找到了一些使用 PIL 进行颜色检测的方法(here https://stackoverflow.com/questions/2270874/image-color-detection-using-python and here https://stackoverflow.com/questions/14041562/python-pil-detect-if-an-image-is-completely-black-or-white)但我不知道如何回答这个简单的(视觉)问题:它是更多黑白、彩色还是灰度图像?

我更喜欢在这部分使用 Python 和 PIL,但如果有人有线索(或解决方案),我也可以使用 OpenCV。


我尝试了 Gepeto 的解决方案,它有很多误报,因为颜色大方差可能只是偶然相似。正确的方法是计算每个像素的方差。首先缩小图像,这样您就不必处理数百万像素。

默认情况下,该函数还使用平均颜色偏差调整,我发现这可以改善预测。这样做的一个副作用是,它还会检测单色但非灰度图像(通常是棕褐色调的东西,该模型在检测与灰度的较大偏差时似乎有点崩溃)。您可以通过对色带平均值进行阈值处理将它们与真实灰度分开。

我在包含 13,000 张摄影图像的测试集上运行了该方法,得到了 99.1% 的准确率和 92.5% 的召回率的分类结果。通过使用非线性偏差调整可能会进一步提高准确性(例如,颜色值必须在 0 到 255 之间)。也许查看中位数平方误差而不是 MSE 会更好地允许例如带有小彩色标记的灰度图像。

from PIL import Image, ImageStat
def detect_color_image(file, thumb_size=40, MSE_cutoff=22, adjust_color_bias=True):
    pil_img = Image.open(file)
    bands = pil_img.getbands()
    if bands == ('R','G','B') or bands== ('R','G','B','A'):
        thumb = pil_img.resize((thumb_size,thumb_size))
        SSE, bias = 0, [0,0,0]
        if adjust_color_bias:
            bias = ImageStat.Stat(thumb).mean[:3]
            bias = [b - sum(bias)/3 for b in bias ]
        for pixel in thumb.getdata():
            mu = sum(pixel)/3
            SSE += sum((pixel[i] - mu - bias[i])*(pixel[i] - mu - bias[i]) for i in [0,1,2])
        MSE = float(SSE)/(thumb_size*thumb_size)
        if MSE <= MSE_cutoff:
            print "grayscale\t",
        else:
            print "Color\t\t\t",
        print "( MSE=",MSE,")"
    elif len(bands)==1:
        print "Black and white", bands
    else:
        print "Don't know...", bands
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Python检测图像是彩色、灰度还是黑白 的相关文章

随机推荐

  • 检查R中的值是否==整数(0)[重复]

    这个问题在这里已经有答案了 我正在使用grepR 中的函数检查是否满足条件正则表达式 我所拥有的是这样的 grep expression string 一个例子可能是 value grep s A z value 哪个输出 整数 0 我想要
  • 具有绝对导入的 Rollup 和 Typescript 类型声明

    我正在制作 React 组件库 项目结构是这样的 src components utils hooks 现在我尝试使用汇总生成类型 d ts 文件 类型是生成的 但例如我的组件NumberInput正在使用绝对导入Input像这样的组件 i
  • React 与 ReactDOM?

    我有点新的反应 我发现我们必须导入两件事才能开始 React and ReactDOM 任何人都可以解释其中的区别 我正在阅读反应文档 https reactjs org docs 但它没有说 React 和 ReactDOM 最近才被分成
  • C++ cout 不显示任何内容

    什么可以解释为什么 cout 在此代码中没有显示任何内容 我知道它与 v 0 1 行有关但我不知道为什么 有人有解释吗 编辑 我也知道改变 v 0 1 对于 v push back 1 会解决问题 include
  • FreeTDS 不使用配置的 tds 版本

    freetds v0 91 tds 版本不匹配 我想在 Ubuntu 14 04 上连接到带有 FreeBSD 的 Windows SQL Server FreeTDS 使用 apt get 安装 我使用以下命令尝试了不同的 tds 版本
  • iexpress 生成的可执行文件在 XP 上不是有效的 win32 应用程序

    我使用的是 c windows syswow64 中的 32 位 iexpress exe 生成的 exe 文件在 Windows 7 和 Windows 8 x64 上运行良好 我可以确认它是 32 位应用程序 然而 当尝试在 XP 上运
  • 用C语言访问Gmail

    python 有等效的吗libgmail http libgmail sourceforge net in C Edit 我正在努力实现相当于GmailFS http en wikipedia org wiki GmailFS在C 如果您能
  • 使用knitr时无法让LyX生成不在同一行的两个图

    这里是针织新手 喜欢这个包 一切都很顺利 除了在 LyX 中编译后两个图不会并排出现 不确定发生了什么 因为我正在逐字复制 knitr 图形手册 knitr graphics lyx 中的示例 我的 LyX 代码 在图形浮动中 lt
  • Spring boot:排除一些自动配置的bean

    我有一个使用 spring kafka 的 Spring boot 项目 在这个项目中 我构建了一些包装 spring kafka beans 的事件驱动组件 即 KafkaTemplate 和 ConcurrentKafkaListene
  • 如何通过.NET/C# 查找CPU 核心数?

    有没有办法通过 NET C 找出CPU核心数 PS这是一个直接的代码问题 而不是 我应该使用多线程吗 问题 您可以获得与处理器相关的多种不同信息 物理处理器数量 核心数 逻辑处理器的数量 这些都可以不同 如果机器具有 2 个支持超线程的双核
  • 带有 angular2 的非 SPA

    我开始使用 Angular2 带有 Express js 后端 目的是将页面的几个部分的控制权传递给 Angular2 组件 但我最终意识到 当 Angular2 控制页面的整个区域时 系统会更有效 但是 我的应用程序不是 SPA 除了保存
  • log4net 多个附加程序,写入事件查看器

    我使用 log4net 进行日志记录 我有两个附加程序 一个文件和另一个事件日志附加程序 我在注册表编辑器中注册了应用程序 问题是现在两个记录器都在事件查看器中写入 我需要fileAppender写入文件并eventLogAppender显
  • Cakephp find函数中限制sql

    我如何在cakephp中的sql中使用限制 我的意思是下面是sql select from emp limit 3 4 如何在 find 函数中使用上述限制 3 4 更好的方法 this gt Emp gt find all array l
  • VB6 子串索引

    我正在尝试在 VB6 中匹配电子邮件地址字符串中的域名 但这不是我的日常语言 我基本上想从地址中提取域名 即 电子邮件受保护 cdn cgi l email protection 进行比较 我想通过获取 之后的所有内容来提取它 我想找到 的
  • R 中的 3d 曲面图

    我正在寻找使用 Rplotly库来创建 x y z 坐标数据的 3D 曲面图 类似于下面的链接所示 https plot ly r 3d surface plots https plot ly r 3d surface plots 看来pl
  • 如何在每次显示视图控制器时随机化 UILabel 文本

    如何在每次显示视图控制器时使 ViewController 中的标签具有不同的文本字符串 谢谢 我正在使用 Swift 3 假设您知道如何添加UILabel给你的ViewController 这里是如何在开始时选择随机文本的快速示例 cla
  • Haskell 中的自定义 concat (++) 运算符

    是否可以定义我自己的 Haskell 中自定义数据类型的运算符 I have data MyType MyType String 我想将我自己的串联运算符定义为 instance MyType where MyType x MyType y
  • java.lang.IllegalArgumentException:指定的类型 [com.sun.faces.application.WebappLifecycleListener] 不是预期的侦听器类型之一

    我遇到了以下问题 我有一个使用 Java 8 和 tomcat 7 的应用程序 现在我尝试转向 tomcat 8 我下载了一个开发环境 tomcat 8 二进制文件并开始在 eclipse 中工作 我添加了一个新服务器 Apache tom
  • Android按钮动画与计时同步

    我需要建议如何创建一些我想添加到按钮中的动画 其实我有动画代码 我需要的是如何正确设置每个动画的时间 这是我已经尝试过的 fest setVisibility View INVISIBLE handler postDelayed new R
  • 使用Python检测图像是彩色、灰度还是黑白

    我从 jpeg 格式的 PDF 文件中提取页面图像 我需要确定每个图像是否更灰度 彩色或黑白 具有容差因子 我找到了一些使用 PIL 进行颜色检测的方法 here https stackoverflow com questions 2270