pil相关剧本:画面没有两极分化

时间:2013-08-09 11:29:52

标签: 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.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

即使视觉上看起来如此,图片也不会偏振成两种颜色

发生了什么事?

1 个答案:

答案 0 :(得分:1)

我认为这里的问题是你正在使用的源文件是压缩的(可能是.jpeg文件)。当您将sys.argv[1]传递给file.save时,PIL会决定是否根据文件扩展名压缩“极化”图像。因此,如果sys.argv[1]=="test.jpg",那么写入磁盘的文件将被压缩。

压缩可以在您期待的纯红色和黑色之间产生颜色。

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

顺便提一下,这种“偏振”通常被称为“阈值”,而你生成的双色调图像是一个阈值图像。

此外,我认为使用file一词作为变量名称并不是一个好主意,因为它用于其他事情,例如http://docs.python.org/2/library/functions.html#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