[英]Using python to determine if an image should be saved as bitonal tiff or color jp2
我已经测试了以下幼稚的、基于规则的方法(代码在底部)。 它的作用是使用PIL
包读取图像,获取像素的RGB
值,如果R
和G
、 R
和B
以及G
和B
之间的绝对差异低于 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.