Image Gurus:优化我的Python PNG透明度功能

Chr*_*loe 5 python algorithm google-app-engine png image

我需要用alpha透明度替换PNG图像中的所有白色(ish)像素.

我在AppEngine中使用Python,因此无法访问像PIL,imagemagick等库.AppEngine确实有一个图像库,但主要是调整图像大小.

我发现了一个优秀的小pyPNG模块,并成功地完成了我需要的一个小功能:

make_transparent.py

主循环的伪代码类似于:

for each pixel:
    if pixel looks "quite white":
        set pixel values to transparent
    otherwise:
        keep existing pixel values
Run Code Online (Sandbox Code Playgroud)

和(假设8位值)"相当白"将是:

where each r,g,b value is greater than "240" 
AND each r,g,b value is within "20" of each other
Run Code Online (Sandbox Code Playgroud)

这是我第一次以这种方式处理原始像素数据,虽然有效,但它的表现也非常糟糕.似乎必须有一种更有效的方式处理数据而不以这种方式迭代每个像素?(矩阵?)

我希望有更多处理这些事情经验的人可能能够指出我的算法中一些更明显的错误/改进.

谢谢!

Sax*_*uce 1

这仍然会访问每个像素,但可能会更快:

new_pixels = []
for row in pixels:
    new_row = array('B', row)
    i = 0
    while i < len(new_row):
        r = new_row[i]
        g = new_row[i + 1]
        b = new_row[i + 2]
        if r>threshold and g>threshold and b>threshold:
            m = int((r+g+b)/3)
            if nearly_eq(r,m,tolerance) and nearly_eq(g,m,tolerance) and nearly_eq(b,m,tolerance):
                new_row[i + 3] = 0
        i += 4
    new_pixels.append(new_row)
Run Code Online (Sandbox Code Playgroud)

它避免了切片生成器,切片生成器将为每个像素复制整行像素(每次少一个像素)。

它还通过直接复制输入行来预分配输出行,然后只写入已更改的像素的 alpha 值。

更快的方法是根本不分配一组新的像素,而直接在源图像中的像素上写入(假设您不需要源图像进行其他任何操作)。