1

我已经在 SO 上四处寻找可能有效的抗锯齿算法,但它们都会产生模糊的图像和/或不适用于我当前的方法。

我使用 Python 和 PIL 创建了一个逐像素过滤器,它创建了一个调色板(它们如何确定并不重要。)代码创建了一个如下图所示的图像。如您所见,它非常混叠。

http://i.imgur.com/BlGNzmP.png

我听说消除图像锯齿的最佳方法是在绘制图像时进行,而不是在绘制之后;但是,我不确定这是否可以用我当前的方法来实现,即循环遍历每个单独的像素。如果可以在绘制图像时对图像进行抗锯齿的方法,请在此处发布。

这是代码:

import Image, ImageDraw
from collections import Counter

def avg_color(arr):
    r,g,b = 0,0,0
    for item in arr:
        r += item[0]
        g += item[1]
        b += item[2]
    l = len(arr)
    return (r//l,g//l,b//l)

COLOR_NUMBER = 12

PATH = "test.png"

COLORS = [
(255,255,255),
(0,0,0)
]

im = Image.open(PATH)
rgbim = im.convert('RGB')

size = rgbim.size

nim = Image.new('RGB', size)
draw = ImageDraw.Draw(nim)

for i in range(COLOR_NUMBER-2):
    devs = [[765 for j in range(size[1])] for k in range(size[0])]
    cols = [[765 for j in range(size[1])] for k in range(size[0])]
    ind = []
    for x in range(size[0]):
        for y in range(size[1]):
            r,g,b = rgbim.getpixel((x,y))
            cols[x][y] = (r,g,b)
            for c in COLORS:
                diff = abs(c[0]-r)+abs(c[1]-g)+abs(c[2]-b)
                devs[x][y] = min(diff,devs[x][y])

    h = (0,0)
    for x in range(size[0]):
        for y in range(size[1]):
            if devs[x][y] > devs[h[0]][h[1]]:
                h = (x,y)
    print "Added color",cols[h[0]][h[1]]
    COLORS.append(cols[h[0]][h[1]])



print("Created palette.")
print(COLORS)

for x in range(size[0]):
    for y in range(size[1]):
        r,g,b = rgbim.getpixel((x,y))
        devarray = []
        col = COLORS[0]
        for c in COLORS:
            diff = abs(c[0]-r)+abs(c[1]-g)+abs(c[2]-b)
            devarray.append(diff)
        smallest = 0
        for i in range(len(devarray)):
            if devarray[i] < devarray[smallest]:
                smallest = i
        col = COLORS[smallest]
        draw.point((x,y),fill=col)

print "Finished rough image."


nim.show()
4

0 回答 0