Image processing 与pil相关的脚本:图片没有极化

Image processing 与pil相关的脚本:图片没有极化,image-processing,python-2.7,python-imaging-library,Image Processing,Python 2.7,Python Imaging Library,这是我写的一个脚本,用来将图片分成两种颜色。我这么做是因为所有看起来黑白相间的迷宫都不是被解读为两种颜色,而是一堆颜色。所以我想为什么不自己写一个脚本来将图片两极化 脚本如下: import sys import Image file=Image.open(sys.argv[1]) file=file.convert('RGB') w,h=file.size color={} for i in range(w): for j in range(h): aux=file.

这是我写的一个脚本,用来将图片分成两种颜色。我这么做是因为所有看起来黑白相间的迷宫都不是被解读为两种颜色,而是一堆颜色。所以我想为什么不自己写一个脚本来将图片两极化

脚本如下:

import sys
import Image

file=Image.open(sys.argv[1])
file=file.convert('RGB')
w,h=file.size
color={}
for i in range(w):
    for j in range(h):
        aux=file.getpixel((i,j))
        if aux >(200,200,200):
            file.putpixel((i,j),(255,0,0))
        else:
            file.putpixel((i,j),(0,0,0))


file.save(sys.argv[1])
问题 当以下脚本尝试读取上述脚本结果中的颜色时

import sys
import Image

file=Image.open(sys.argv[1])
file=file.convert('RGB')
w,h=file.size
color={}
for i in range(w):
    for j in range(h):
        aux=file.getpixel((i,j))
        if aux not in color:
            color[aux]=1
        else:
            color[aux]+=1


print "file stat"
print color
即使在视觉上,这幅画看起来也不会被极化成两种颜色


发生了什么?

我认为这里的问题是您使用的源文件被压缩了(可能是.jpeg文件)。将
sys.argv[1]
传递到
file.save
PIL将根据文件扩展名决定是否压缩“偏振”图像。因此,如果
sys.argv[1]==“test.jpg”
则写入磁盘的文件将被压缩

压缩可以使颜色介于您期望的纯红色和黑色之间

解决此问题的一个简单方法是使用未压缩格式(如.png)将输出写入文件

顺便提一下,这种“偏振”通常被称为“阈值化”,并且您正在生成的双色调图像是阈值化图像

另外,我认为使用
file
这个词作为变量名不是一个好主意,因为它用于其他事情,例如

下面的代码版本演示了让PIL编写阈值图像的压缩版本与未压缩版本之间的区别:

import sys
from PIL import Image

im=Image.open("test.jpg")
im=im.convert('RGB')
w,h=im.size
color={}
for i in range(w):
    for j in range(h):
        aux=im.getpixel((i,j))
        if aux >(200,200,200):
            im.putpixel((i,j),(255,0,0))
        else:
            im.putpixel((i,j),(0,0,0))


im.save("test_copy.jpg")
im.save("test_copy.png")


im=Image.open("test_copy.jpg")
im=im.convert('RGB')
w,h=im.size
color={}
for i in range(w):
    for j in range(h):
        aux=im.getpixel((i,j))
        if aux not in color:
            color[aux]=1
        else:
            color[aux]+=1


print "Compressed file stat"
print color

im=Image.open("test_copy.png")
im=im.convert('RGB')
w,h=im.size
color={}
for i in range(w):
    for j in range(h):
        aux=im.getpixel((i,j))
        if aux not in color:
            color[aux]=1
        else:
            color[aux]+=1


print "Uncompressed file stat"
print color

我认为这里的问题是您使用的源文件是压缩的(可能是.jpeg文件)。将
sys.argv[1]
传递到
file.save
PIL将根据文件扩展名决定是否压缩“偏振”图像。因此,如果
sys.argv[1]==“test.jpg”
则写入磁盘的文件将被压缩

压缩可以使颜色介于您期望的纯红色和黑色之间

解决此问题的一个简单方法是使用未压缩格式(如.png)将输出写入文件

顺便提一下,这种“偏振”通常被称为“阈值化”,并且您正在生成的双色调图像是阈值化图像

另外,我认为使用
file
这个词作为变量名不是一个好主意,因为它用于其他事情,例如

下面的代码版本演示了让PIL编写阈值图像的压缩版本与未压缩版本之间的区别:

import sys
from PIL import Image

im=Image.open("test.jpg")
im=im.convert('RGB')
w,h=im.size
color={}
for i in range(w):
    for j in range(h):
        aux=im.getpixel((i,j))
        if aux >(200,200,200):
            im.putpixel((i,j),(255,0,0))
        else:
            im.putpixel((i,j),(0,0,0))


im.save("test_copy.jpg")
im.save("test_copy.png")


im=Image.open("test_copy.jpg")
im=im.convert('RGB')
w,h=im.size
color={}
for i in range(w):
    for j in range(h):
        aux=im.getpixel((i,j))
        if aux not in color:
            color[aux]=1
        else:
            color[aux]+=1


print "Compressed file stat"
print color

im=Image.open("test_copy.png")
im=im.convert('RGB')
w,h=im.size
color={}
for i in range(w):
    for j in range(h):
        aux=im.getpixel((i,j))
        if aux not in color:
            color[aux]=1
        else:
            color[aux]+=1


print "Uncompressed file stat"
print color

是您正在读取的图像,因此,由于您使用命令行参数的方式,是以压缩格式(如.jpeg)写入的图像?
file.save(sys.argv[1])
命令中的压缩步骤可能会产生预期的红色和黑色之间的中间颜色。例如,如果您使用.png文件运行此脚本,是否存在相同的问题?是您正在读取的图像,因此,由于您使用命令行参数的方式,是以压缩格式(如.jpeg)写入的图像?
file.save(sys.argv[1])
命令中的压缩步骤可能会产生预期的红色和黑色之间的中间颜色。例如,如果你用一个.png文件运行这个脚本,你是否也有同样的问题?“千方百计”…我无法相信我是如何错过了它。“千方百计”…我无法相信我是如何错过了它。