繁体   English   中英

使用 python 确定图像是否应保存为双色调 tiff 或颜色 jp2

[英]Using python to determine if an image should be saved as bitonal tiff or color jp2

我有一堆书本的扫描页面,需要一种自动方式来确定页面应该是双色调 tiff 还是彩色 jp2。 如果页面只是文本和黑白图表,它将被转换为双色 tiff。 如果页面上有彩色图像或突出显示或其他内容,那么它将是彩色 jp2。 我有一些例子:

黑白示例: 1 2 3 4 5

颜色示例: 1 2 3

我已经测试了以下幼稚的、基于规则的方法(代码在底部)。 它的作用是使用PIL包读取图像,获取像素的RGB值,如果RGRB以及GB之间的绝对差异低于 35(我刚刚定义为示例),它被认为是灰度、黑白像素。 否则,它将是一个彩色像素。 在我的基于规则的方法中,如果超过 5% 的图像由彩色像素组成,那么我认为图像是color jp2 ,否则它是bitonal tiff

我试过你的示例图像,它错误地分类了第 5 个双色调 tiff 图像(可能是因为图像有点偏黄,所以你需要为这些图像创建一个规则)和第二个颜色 jp2 图像(它真的很暗颜色,这可以欺骗我的灰度规则):

在此处输入图片说明

遵循基于规则的方法将使您获得相当好的结果,但要考虑所有情况可能会很麻烦。 另一方面,您可以做的是使用受监督的机器学习模型,您可以在其中使用标签(无论图像是双色调 tiff 还是彩色 jp2)和图像的RGB向量,训练它,看看是否它产生了良好的结果。 它可能不会有 100% 的准确度,但会比尝试手动找出最佳的基于规则的方法要好,尽管它会做更多的工作。 现在由您来确定您想要达到的准确度。

from PIL import Image

def process_image(filename):

    image = Image.open(filename)
    width, height = image.size
    pixel_grid = image.load()

    colored_rgbs_count = 0

    for i in range(width):
        for j in range(height):
            r, g, b = pixel_grid[i,j]
            if abs(r - g) > 35 or abs(r - b) > 35 or abs(b - g) > 35:
                colored_rgbs_count += 1
            
    return 'color jp2' if colored_rgbs_count > width * height * 0.05 else 'bitonal tiff'

print(f'bitonal_1: {process_image("bitonal_1.jpg")}')
print(f'bitonal_2: {process_image("bitonal_2.jpg")}')
print(f'bitonal_3: {process_image("bitonal_3.jpg")}')
print(f'bitonal_4: {process_image("bitonal_4.jpg")}')
print(f'bitonal_5: {process_image("bitonal_5.jpg")}')

print(f'color_1: {process_image("color_1.jpg")}')
print(f'color_2: {process_image("color_2.jpg")}')
print(f'color_3: {process_image("color_3.jpg")}')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM