Changeset 2178


Ignore:
Timestamp:
Dec 31, 2007, 10:48:36 AM (12 years ago)
Author:
Sam Hocevar
Message:
  • Always process the gradient image before the Lenna image.
  • A little script refactoring here and there.
Location:
www/study
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • www/study/study.py

    r2174 r2178  
    1616    def __init__(self, *args):
    1717        if args[0].__class__ == str:
    18             print " * loading %s" % (args[0],)
     18            print "[LOAD] %s" % (args[0],)
    1919        gd.image.__init__(self, *args)
    2020    def save(self, name):
    21         print " * saving %s" % (name,)
     21        print "[PNG] %s" % (name,)
    2222        self.writePng(name)
    2323    def getGray(self, x, y):
     
    8585    Cto3 = staticmethod(Cto3)
    8686    Cto4 = staticmethod(Cto4)
     87
     88# Create matrices
     89def Matrix(w, h, val = 0):
     90    return [[val] * w for n in range(h)]
    8791
    8892##############################################################################
     
    139143                (ix, iy) = (64. * x + 1, 64. * y + 1)
    140144                if ed and val == -1:
    141                     val = 0
    142                     c = '#ccc'
     145                    val = ''
     146                    c = '#bbf'
    143147                else:
    144148                    c = colorise(val)
     
    175179        f.write(self._data)
    176180        f.close()
    177         print " * exporting %s" % (name,)
    178181        f = os.popen("inkscape %s -a %u:%u:%u:%u -w%u -h%u -e %s >/dev/null 2>&1" % (svgname, 0, 0, self._w, self._h, size * self._w / 64., size * self._h / 64., name))
     182        print "[SVG] %s" % (name,)
    179183        f.close()
    180184        os.unlink(svgname)
     
    230234# Create a 32x256 greyscale gradient
    231235if chapter(0):
    232     gradient256bw = Image((32, 256))
     236    grad256bw = Image((32, 256))
    233237    for x in range(32):
    234238        for y in range(256):
    235             gradient256bw.setGray(x, 255 - y, y / 255.)
    236     gradient256bw.save("gradient256bw.png")
     239            grad256bw.setGray(x, 255 - y, y / 255.)
     240    grad256bw.save("gradient256bw.png")
    237241else:
    238     gradient256bw = Image("gradient256bw.png")
     242    grad256bw = Image("gradient256bw.png")
    239243
    240244##############################################################################
     
    255259
    256260if chapter(1):
     261    test11x(grad256bw, 0.5).save("grad1-1-1.png")
    257262    test11x(lenna256bw, 0.5).save("out1-1-1.png")
     263    test11x(grad256bw, 0.4).save("grad1-1-2.png")
    258264    test11x(lenna256bw, 0.4).save("out1-1-2.png")
     265    test11x(grad256bw, 0.6).save("grad1-1-3.png")
    259266    test11x(lenna256bw, 0.6).save("out1-1-3.png")
    260     test11x(gradient256bw, 0.5).save("grad1-1-1.png")
    261     test11x(gradient256bw, 0.4).save("grad1-1-2.png")
    262     test11x(gradient256bw, 0.6).save("grad1-1-3.png")
    263267
    264268# Output 1.2.1: 3-colour threshold
     
    277281
    278282if chapter(1):
     283    test12x(grad256bw, 3).save("grad1-2-1.png")
    279284    test12x(lenna256bw, 3).save("out1-2-1.png")
     285    test12x(grad256bw, 5).save("grad1-2-2.png")
    280286    test12x(lenna256bw, 5).save("out1-2-2.png")
    281     test12x(gradient256bw, 3).save("grad1-2-1.png")
    282     test12x(gradient256bw, 5).save("grad1-2-2.png")
    283287
    284288# Output 1.2.3: 3-colour threshold, minimal error
     
    297301
    298302if chapter(1):
     303    test12y(grad256bw, 3).save("grad1-2-3.png")
    299304    test12y(lenna256bw, 3).save("out1-2-3.png")
     305    test12y(grad256bw, 5).save("grad1-2-4.png")
    300306    test12y(lenna256bw, 5).save("out1-2-4.png")
    301     test12y(gradient256bw, 3).save("grad1-2-3.png")
    302     test12y(gradient256bw, 5).save("grad1-2-4.png")
    303307
    304308# Output 1.3.1: 2-colour threshold, dynamic thresholding
     
    340344
    341345if chapter(1):
     346    test13x(grad256bw, 2).save("grad1-3-1.png")
    342347    test13x(lenna256bw, 2).save("out1-3-1.png")
    343     test13x(gradient256bw, 2).save("grad1-3-1.png")
     348    test13x(grad256bw, 5).save("grad1-3-2.png")
    344349    test13x(lenna256bw, 5).save("out1-3-2.png")
    345     test13x(gradient256bw, 5).save("grad1-3-2.png")
    346350
    347351# Output 1.4.1: uniform random dithering
     
    358362
    359363if chapter(1):
     364    test141(grad256bw).save("grad1-4-1.png")
    360365    test141(lenna256bw).save("out1-4-1.png")
    361     test141(gradient256bw).save("grad1-4-1.png")
    362366
    363367# Output 1.4.2: gaussian random dithering
     
    374378
    375379if chapter(1):
     380    test142(grad256bw).save("grad1-4-2.png")
    376381    test142(lenna256bw).save("out1-4-2.png")
    377     test142(gradient256bw).save("grad1-4-2.png")
    378382
    379383# Output 1.4.3: 3-colour threshold, dynamic thresholding, gaussian perturbation
    380384if chapter(1):
    381385    fuzzy = lambda : random.gauss(0., 0.08)
     386    test13x(grad256bw, 4, fuzzy).save("grad1-4-3.png")
    382387    test13x(lenna256bw, 4, fuzzy).save("out1-4-3.png")
    383     test13x(gradient256bw, 4, fuzzy).save("grad1-4-3.png")
    384388
    385389##############################################################################
     
    430434
    431435if chapter(2):
     436    test211(grad256bw).save("grad2-1-1.png")
    432437    test211(lenna256bw).save("out2-1-1.png")
    433     test211(gradient256bw).save("grad2-1-1.png")
    434438
    435439# Pattern 2.2.1: vertical, mixed and horizontal black-white halftones
     
    483487def makebayer(rank, mat = False):
    484488    if not mat:
    485         mat = [[0]]
     489        mat = Matrix(1, 1)
    486490    if not rank:
    487491        return mat
    488492    n = len(mat)
    489     newmat = [[0] * n * 2 for i in range(n * 2)]
     493    newmat = Matrix(n * 2, n * 2)
    490494    for j in range(n):
    491495        for i in range(n):
     
    523527
    524528if chapter(2):
     529    ordereddither(grad256bw, DITHER_BAYER22).save("grad2-3-0.png")
    525530    ordereddither(lenna256bw, DITHER_BAYER22).save("out2-3-0.png")
    526     ordereddither(gradient256bw, DITHER_BAYER22).save("grad2-3-0.png")
    527531
    528532    Svg(DITHER_BAYER44, bayercol).save("fig2-3-2.png", 40)
     533    ordereddither(grad256bw, DITHER_BAYER44).save("grad2-3-1.png")
    529534    ordereddither(lenna256bw, DITHER_BAYER44).save("out2-3-1.png")
    530     ordereddither(gradient256bw, DITHER_BAYER44).save("grad2-3-1.png")
    531535
    532536    Svg(DITHER_BAYER88, bayercol).save("fig2-3-2b.png", 30)
     537    ordereddither(grad256bw, DITHER_BAYER88).save("grad2-3-1b.png")
    533538    ordereddither(lenna256bw, DITHER_BAYER88).save("out2-3-1b.png")
    534     ordereddither(gradient256bw, DITHER_BAYER88).save("grad2-3-1b.png")
    535539
    536540    Svg(DITHER_CLUSTER44).save("fig2-3-3.png", 40)
     541    ordereddither(grad256bw, DITHER_CLUSTER44).save("grad2-3-2.png")
    537542    ordereddither(lenna256bw, DITHER_CLUSTER44).save("out2-3-2.png")
    538     ordereddither(gradient256bw, DITHER_CLUSTER44).save("grad2-3-2.png")
    539543
    540544    Svg(DITHER_CLUSTER88).save("fig2-3-3b.png", 30)
     545    ordereddither(grad256bw, DITHER_CLUSTER88).save("grad2-3-2b.png")
    541546    ordereddither(lenna256bw, DITHER_CLUSTER88).save("out2-3-2b.png")
    542     ordereddither(gradient256bw, DITHER_CLUSTER88).save("grad2-3-2b.png")
    543547
    544548    Svg(DITHER_LINE53).save("fig2-3-4.png", 40)
     549    ordereddither(grad256bw, DITHER_LINE53).save("grad2-3-3.png")
    545550    ordereddither(lenna256bw, DITHER_LINE53).save("out2-3-3.png")
    546     ordereddither(gradient256bw, DITHER_LINE53).save("grad2-3-3.png")
    547551
    548552# Output 2.4.1: 4x4 Bayer dithering with gaussian perturbation
     
    563567
    564568if chapter(2):
     569    test241(grad256bw, DITHER_BAYER88).save("grad2-4-1.png")
    565570    test241(lenna256bw, DITHER_BAYER88).save("out2-4-1.png")
    566     test241(gradient256bw, DITHER_BAYER88).save("grad2-4-1.png")
    567571
    568572# Output 2.4.2: random dither matrice selection
     
    575579    for y in range(h / dy):
    576580        for x in range(w / dx):
    577             mat = mlist[(int)(random.random() * len(mlist))]
     581            mat = random.choice(mlist)
    578582            for j in range(dy):
    579583                for i in range(dx):
     
    604608          [2, 0, 5]]
    605609    mlist = [m1, m2, m3, m4, m5, m6]
     610    test242(grad256bw, mlist).save("grad2-4-2.png")
    606611    test242(lenna256bw, mlist).save("out2-4-2.png")
    607     test242(gradient256bw, mlist).save("grad2-4-2.png")
    608612
    609613# Output 2.5.1: cross pattern
     
    626630            (x, y) = ((x + vec[1][0]) % n, (y + vec[1][1]) % n)
    627631    # 3. create big matrix
    628     m = [[0] * n for i in range(n)]
     632    m = Matrix(n, n)
    629633    for v in l:
    630634        for y in range(len(mat)):
     
    649653           [-1,  2, -1]]
    650654    vec = [(2, -1), (1, 2)]
     655    test25x(grad256bw, mat, vec).save("grad2-5-1.png")
    651656    test25x(lenna256bw, mat, vec).save("out2-5-1.png")
    652     test25x(gradient256bw, mat, vec).save("grad2-5-1.png")
    653657    mat = [[-1,  4,  2, -1],
    654658           [ 6,  0,  5,  3],
    655659           [-1,  7,  1, -1]]
    656660    vec = [(2, -2), (3, 1)]
     661    test25x(grad256bw, mat, vec).save("grad2-5-2.png")
    657662    test25x(lenna256bw, mat, vec).save("out2-5-2.png")
    658     test25x(gradient256bw, mat, vec).save("grad2-5-2.png")
    659663    mat = [[-1, -1, -1,  7, -1],
    660664           [-1,  2,  6,  9,  8],
     
    662666           [-1,  4, -1, -1, -1]]
    663667    vec = [(2, 4), (3, 1)]
     668    test25x(grad256bw, mat, vec).save("grad2-5-3.png")
    664669    test25x(lenna256bw, mat, vec).save("out2-5-3.png")
    665     test25x(gradient256bw, mat, vec).save("grad2-5-3.png")
    666670    mat = [[-1, -1,  2, -1],
    667671           [ 0,  1,  3,  8],
     
    669673           [-1,  9, -1, -1]]
    670674    vec = [(2, 2), (0, 5)]
     675    test25x(grad256bw, mat, vec).save("grad2-5-4.png")
    671676    test25x(lenna256bw, mat, vec).save("out2-5-4.png")
    672     test25x(gradient256bw, mat, vec).save("grad2-5-4.png")
    673677
    674678# Output 2.6.1: 4-wise cross pattern
     
    683687           [-1, -1, 11, -1, -1, -1]]
    684688    vec = [(4, -2), (2, 4)]
     689    test25x(grad256bw, mat, vec).save("grad2-6-1.png")
    685690    test25x(lenna256bw, mat, vec).save("out2-6-1.png")
    686     test25x(gradient256bw, mat, vec).save("grad2-6-1.png")
    687691
    688692    mat = [[-1, 12,  6, -1, -1, -1, -1],
     
    693697           [-1, -1, 22,  4, -1, -1, -1]]
    694698    vec = [(5, -1), (-1, 5)]
     699    test25x(grad256bw, mat, vec).save("grad2-6-2.png")
    695700    test25x(lenna256bw, mat, vec).save("out2-6-2.png")
    696     test25x(gradient256bw, mat, vec).save("grad2-6-2.png")
    697701
    698702    mat = [[-1, -1, -1, -1, 30, -1, -1, -1, -1],
     
    705709           [-1, -1, -1, -1, 19, -1, -1, -1, -1]]
    706710    vec = [(6, 2), (-2, 6)]
     711    test25x(grad256bw, mat, vec).save("grad2-6-3.png")
    707712    test25x(lenna256bw, mat, vec).save("out2-6-3.png")
    708     test25x(gradient256bw, mat, vec).save("grad2-6-3.png")
    709713
    710714    mat = [[-1, -1,  3, 35, -1, -1,  1, 33, -1, -1, -1, -1, -1],
     
    728732        return '#dfd'
    729733    Svg(mat, colorise).save("fig2-6-4.png", 25)
     734    test25x(grad256bw, mat, vec).save("grad2-6-4.png")
    730735    test25x(lenna256bw, mat, vec).save("out2-6-4.png")
    731     test25x(gradient256bw, mat, vec).save("grad2-6-4.png")
    732736
    733737    mat = [[ -1, -1, -1, -1, -1, -1,  8, -1],
     
    741745    def colorise(val): return ['#dff', '#ffd', '#fdf'][val % 3]
    742746    #Svg(mat, colorise).save("fig2-6-5.png", 30)
     747    test25x(grad256bw, mat, vec).save("grad2-6-5.png")
    743748    test25x(lenna256bw, mat, vec).save("out2-6-5.png")
    744     test25x(gradient256bw, mat, vec).save("grad2-6-5.png")
    745749
    746750    mat = [[ -1, -1, -1, -1, -1, -1, 24, -1, -1, -1, -1, -1, -1, -1],
     
    756760           [ -1, -1, 49, 40, 67, 58, -1, -1, -1, -1, -1, -1, -1, -1],
    757761           [ -1, -1, -1, 85, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]]
     762    test25x(grad256bw, mat, vec).save("grad2-6-6.png")
    758763    test25x(lenna256bw, mat, vec).save("out2-6-6.png")
    759     test25x(gradient256bw, mat, vec).save("grad2-6-6.png")
    760764
    761765# Output 2.7.1: void and cluster matrix generation
    762766def makegauss(n):
    763767    c = (-1. + n) / 2
    764     mat = [[0] * n for y in range(n)]
     768    mat = Matrix(n, n)
    765769    for y in range(n):
    766770        for x in range(n):
     
    801805def makeuniform(n):
    802806    random.seed(0)
    803     mat = [[0] * n for x in range(n)]
     807    mat = Matrix(n, n)
    804808    for t in range(n * n / 10):
    805809        x = (int)(random.random() * n)
     
    816820
    817821def makevoidandcluster(n):
    818     vnc = [[0] * n for x in range(n)]
     822    vnc = Matrix(n, n)
    819823    # Step 1: step down to zero
    820824    mat = makeuniform(n)
     
    841845    tmp = makevoidandcluster(14)
    842846    Svg(tmp, vnccol(14)).save("fig2-7-1.png", 25)
     847    ordereddither(grad256bw, tmp).save("grad2-7-1.png")
    843848    ordereddither(lenna256bw, tmp).save("out2-7-1.png")
    844     ordereddither(gradient256bw, tmp).save("grad2-7-1.png")
    845849    tmp = makevoidandcluster(25)
    846850    Svg(tmp, vnccol(25)).save("fig2-7-2.png", 20)
     851    ordereddither(grad256bw, tmp).save("grad2-7-2.png")
    847852    ordereddither(lenna256bw, tmp).save("out2-7-2.png")
    848     ordereddither(gradient256bw, tmp).save("grad2-7-2.png")
    849853
    850854##############################################################################
     
    872876    rows = len(mat[0])
    873877    offset = mat[0].index(-1)
    874     ey = [[0.] * (w + rows - 1) for x in range(lines)]
     878    ey = Matrix(w + rows - 1, lines, 0.)
    875879    for y in range(h):
    876880        ex = [0.] * (rows - offset)
     
    956960
    957961if chapter(3):
     962    test3xx(grad256bw, ERROR_NAIVE, False).save("grad3-0-1.png")
    958963    test3xx(lenna256bw, ERROR_NAIVE, False).save("out3-0-1.png")
    959     test3xx(gradient256bw, ERROR_NAIVE, False).save("grad3-0-1.png")
    960964
    961965    Svg(ERROR_FSTEIN).save("fig3-1-1.png", 40)
     966    test3xx(grad256bw, ERROR_FSTEIN, False).save("grad3-1-1.png")
    962967    test3xx(lenna256bw, ERROR_FSTEIN, False).save("out3-1-1.png")
    963     test3xx(gradient256bw, ERROR_FSTEIN, False).save("grad3-1-1.png")
     968    test3xx(grad256bw, ERROR_FSTEIN, True).save("grad3-1-2.png")
    964969    test3xx(lenna256bw, ERROR_FSTEIN, True).save("out3-1-2.png")
    965     test3xx(gradient256bw, ERROR_FSTEIN, True).save("grad3-1-2.png")
    966970
    967971    Svg(ERROR_FAN).save("fig3-2-1.png", 40)
     972    test3xx(grad256bw, ERROR_FAN, False).save("grad3-2-1.png")
    968973    test3xx(lenna256bw, ERROR_FAN, False).save("out3-2-1.png")
    969     test3xx(gradient256bw, ERROR_FAN, False).save("grad3-2-1.png")
    970974    Svg(ERROR_SHIAUFAN).save("fig3-2-1b.png", 40)
     975    test3xx(grad256bw, ERROR_SHIAUFAN, False).save("grad3-2-1b.png")
    971976    test3xx(lenna256bw, ERROR_SHIAUFAN, False).save("out3-2-1b.png")
    972     test3xx(gradient256bw, ERROR_SHIAUFAN, False).save("grad3-2-1b.png")
    973977    Svg(ERROR_SHIAUFAN2).save("fig3-2-1c.png", 40)
     978    test3xx(grad256bw, ERROR_SHIAUFAN2, False).save("grad3-2-1c.png")
    974979    test3xx(lenna256bw, ERROR_SHIAUFAN2, False).save("out3-2-1c.png")
    975     test3xx(gradient256bw, ERROR_SHIAUFAN2, False).save("grad3-2-1c.png")
    976980
    977981    Svg(ERROR_JAJUNI).save("fig3-2-2.png", 40)
     982    test3xx(grad256bw, ERROR_JAJUNI, False).save("grad3-2-2.png")
    978983    test3xx(lenna256bw, ERROR_JAJUNI, False).save("out3-2-2.png")
    979     test3xx(gradient256bw, ERROR_JAJUNI, False).save("grad3-2-2.png")
    980984
    981985    Svg(ERROR_STUCKI).save("fig3-2-3.png", 40)
     986    test3xx(grad256bw, ERROR_STUCKI, False).save("grad3-2-3.png")
    982987    test3xx(lenna256bw, ERROR_STUCKI, False).save("out3-2-3.png")
    983     test3xx(gradient256bw, ERROR_STUCKI, False).save("grad3-2-3.png")
    984988
    985989    Svg(ERROR_BURKES).save("fig3-2-4.png", 40)
     990    test3xx(grad256bw, ERROR_BURKES, False).save("grad3-2-4.png")
    986991    test3xx(lenna256bw, ERROR_BURKES, False).save("out3-2-4.png")
    987     test3xx(gradient256bw, ERROR_BURKES, False).save("grad3-2-4.png")
    988992
    989993    Svg(ERROR_SIERRA).save("fig3-2-5.png", 40)
     994    test3xx(grad256bw, ERROR_SIERRA, False).save("grad3-2-5.png")
    990995    test3xx(lenna256bw, ERROR_SIERRA, False).save("out3-2-5.png")
    991     test3xx(gradient256bw, ERROR_SIERRA, False).save("grad3-2-5.png")
    992996
    993997    Svg(ERROR_SIERRA2).save("fig3-2-6.png", 40)
     998    test3xx(grad256bw, ERROR_SIERRA2, False).save("grad3-2-6.png")
    994999    test3xx(lenna256bw, ERROR_SIERRA2, False).save("out3-2-6.png")
    995     test3xx(gradient256bw, ERROR_SIERRA2, False).save("grad3-2-6.png")
    9961000
    9971001    Svg(ERROR_FILTERLITE).save("fig3-2-7.png", 40)
     1002    test3xx(grad256bw, ERROR_FILTERLITE, False).save("grad3-2-7.png")
    9981003    test3xx(lenna256bw, ERROR_FILTERLITE, False).save("out3-2-7.png")
    999     test3xx(gradient256bw, ERROR_FILTERLITE, False).save("grad3-2-7.png")
    10001004
    10011005    Svg(ERROR_ATKINSON).save("fig3-2-8.png", 40)
     1006    test3xx(grad256bw, ERROR_ATKINSON, False).save("grad3-2-8.png")
    10021007    test3xx(lenna256bw, ERROR_ATKINSON, False).save("out3-2-8.png")
    1003     test3xx(gradient256bw, ERROR_ATKINSON, False).save("grad3-2-8.png")
    1004 
     1008
     1009    #test3xx(grad256bw, ERROR_STAR, False).save("grad3-2-9.png")
    10051010    #test3xx(lenna256bw, ERROR_STAR, False).save("out3-2-9.png")
    1006     #test3xx(gradient256bw, ERROR_STAR, False).save("grad3-2-9.png")
    1007 
     1011
     1012    #test3xx(grad256bw, ERROR_STAR, False).save("grad3-2-9.png")
    10081013    #test3xx(lenna256bw, ERROR_STAR, False).save("out3-2-9.png")
    1009     #test3xx(gradient256bw, ERROR_STAR, False).save("grad3-2-9.png")
    10101014
    10111015# Output 3.3.1: Floyd-Steinberg on grey 90%
     
    10161020        for x in range(128):
    10171021            tmp.setGray(x, y, 0.90)
     1022    test3xx(tmp, ERROR_FSTEIN, True).getZoom(2).save("out3-3-2.png")
    10181023    test3xx(tmp, ERROR_FSTEIN, False).getZoom(2).save("out3-3-1.png")
    1019     test3xx(tmp, ERROR_FSTEIN, True).getZoom(2).save("out3-3-2.png")
    10201024
    10211025# Output 3.3.3: Riemersma dither on a Hilbert curve
     
    10981102
    10991103if chapter(3):
     1104    riemersma(grad256bw, hilbert, 2).save("grad3-3-3.png")
    11001105    riemersma(lenna256bw, hilbert, 2).save("out3-3-3.png")
    1101     riemersma(gradient256bw, hilbert, 2).save("grad3-3-3.png")
     1106    riemersma(grad256bw, hilbert2, 3).save("grad3-3-4.png")
    11021107    riemersma(lenna256bw, hilbert2, 3).save("out3-3-4.png")
    1103     riemersma(gradient256bw, hilbert2, 3).save("grad3-3-4.png")
    11041108
    11051109# Output 3.3.5: spatial Hilbert dither on a Hilbert curve
     
    11531157
    11541158if chapter(3):
     1159    spatialhilbert(grad256bw, hilbert, 2).save("grad3-3-5.png")
    11551160    spatialhilbert(lenna256bw, hilbert, 2).save("out3-3-5.png")
    1156     spatialhilbert(gradient256bw, hilbert, 2).save("grad3-3-5.png")
     1161    spatialhilbert(grad256bw, hilbert2, 3).save("grad3-3-6.png")
    11571162    spatialhilbert(lenna256bw, hilbert2, 3).save("out3-3-6.png")
    1158     spatialhilbert(gradient256bw, hilbert2, 3).save("grad3-3-6.png")
    11591163
    11601164# Output 3.3.7: Knuth's dot diffusion
     
    12081212    # 2. copy image
    12091213    img = [[src.getGray(x, y) for x in range(w)] for y in range(h)]
    1210     aa = [[1.] * w for y in range(h)]
     1214    aa = Matrix(w, h, 1.)
    12111215    # 3. parse all classes
    12121216    for l in classes:
     
    12561260if chapter(3):
    12571261    Svg(ERROR_DOT).save("fig3-3-7b.png", 40)
     1262    test337(grad256bw, DITHER_CLUSTER88, ERROR_DOT, 0.).save("grad3-3-7.png")
    12581263    test337(lenna256bw, DITHER_CLUSTER88, ERROR_DOT, 0.).save("out3-3-7.png")
    1259     test337(gradient256bw, DITHER_CLUSTER88, ERROR_DOT, 0.).save("grad3-3-7.png")
     1264    tmp = sharpen(grad256bw, 0.9)
     1265    test337(tmp, DITHER_CLUSTER88, ERROR_DOT, 0.).save("grad3-3-8.png")
     1266    test337(tmp, DITHER_CLUSTER88, ERROR_DOT, 0.2).save("grad3-3-9.png")
     1267    test3xx(tmp, ERROR_FSTEIN, True).save("grad3-3-10.png")
    12601268    tmp = sharpen(lenna256bw, 0.9)
    12611269    test337(tmp, DITHER_CLUSTER88, ERROR_DOT, 0.).save("out3-3-8.png")
    12621270    test337(tmp, DITHER_CLUSTER88, ERROR_DOT, 0.2).save("out3-3-9.png")
    12631271    test3xx(tmp, ERROR_FSTEIN, True).save("out3-3-10.png")
    1264     tmp = sharpen(gradient256bw, 0.9)
    1265     test337(tmp, DITHER_CLUSTER88, ERROR_DOT, 0.).save("grad3-3-8.png")
    1266     test337(tmp, DITHER_CLUSTER88, ERROR_DOT, 0.2).save("grad3-3-9.png")
    1267     test3xx(tmp, ERROR_FSTEIN, True).save("grad3-3-10.png")
    12681272
    12691273# Output 3.3.11: omni-directional error diffusion
     
    12911295    Svg(ERROR_OMNI).save("fig3-3-11.png", 40)
    12921296
     1297    mat = test3311(grad256bw)
     1298    test337(grad256bw, mat, ERROR_OMNI, 0.).save("grad3-3-11.png")
     1299
    12931300    mat = test3311(lenna256bw)
    12941301    tmp = [[str(mat[y][x]) for x in range(16)] for y in range(12)]
     
    12971304    Svg(tmp).save("fig3-3-11b.png", 20)
    12981305    test337(lenna256bw, mat, ERROR_OMNI, 0.).save("out3-3-11.png")
    1299 
    1300     mat = test3311(gradient256bw)
    1301     test337(gradient256bw, mat, ERROR_OMNI, 0.).save("grad3-3-11.png")
    13021306
    13031307# Output 3.4.1: Ostromoukhov's variable error diffusion
     
    13731377            '<tspan style="font-style:italic">d3(i)</tspan>', 0]]
    13741378    Svg(mat).save("fig3-4-1.png", 40)
     1379    test341(grad256bw, True).save("grad3-4-1.png")
    13751380    test341(lenna256bw, True).save("out3-4-1.png")
    1376     test341(gradient256bw, True).save("grad3-4-1.png")
    13771381
    13781382def test351(src, mat, tiles, diff, serpentine, glob):
     
    13831387    ty = len(tiles[0])
    13841388    tx = len(tiles[0][0])
    1385     cur = [[0.] * tx for x in range(ty)]
     1389    cur = Matrix(tx, ty, 0.)
    13861390    w, h = w / tx, h / ty
    13871391    lines = len(mat)
    13881392    rows = len(mat[0])
    13891393    offset = mat[0].index(-1)
    1390     ey = [[0.] * (w + rows - 1) for x in range(lines)]
     1394    ey = Matrix(w + rows - 1, lines, 0.)
    13911395    for y in range(h):
    13921396        ex = [0.] * (rows - offset)
     
    14061410            for n in range(ntiles):
    14071411                e = 0.
    1408                 tune = 0.
    1409                 tune += random.random() / 1000.
     1412                d1 = 0.
     1413                d2 = random.random() / 1000.
    14101414                for j in range(ty):
    14111415                    for i in range(tx):
    14121416                        e += cur[j][i] - tiles[n][j][i]
    1413                         tune += abs(cur[j][i] - tiles[n][j][i])
     1417                        d1 += diff[j][i] * (cur[j][i] - tiles[n][j][i])
     1418                        d2 += diff[j][i] * abs(cur[j][i] - tiles[n][j][i])
    14141419                if glob:
    1415                     d = abs(e) + tune / 1000.
     1420                    d = abs(d1) + d2 / 1000.
    14161421                else:
    1417                     d = abs(e) / (tx * ty) + tune
     1422                    d = abs(d1) / (tx * ty) + d2
    14181423                if d < dist:
    14191424                    dist = d
     
    15051510    Svg(mat).save("fig3-5-2.png", 40)
    15061511
     1512    test351(grad256bw, [[-1, 0]],
     1513            LINES22, DIFF_EVEN22, True, True).save("grad3-5-1.png")
    15071514    test351(lenna256bw, [[-1, 0]],
    15081515            LINES22, DIFF_EVEN22, True, True).save("out3-5-1.png")
    1509     test351(gradient256bw, [[-1, 0]],
    1510             LINES22, DIFF_EVEN22, True, True).save("grad3-5-1.png")
     1516    test351(grad256bw, ERROR_FSTEIN,
     1517            LINES22, DIFF_EVEN22, True, True).save("grad3-5-2.png")
    15111518    test351(lenna256bw, ERROR_FSTEIN,
    15121519            LINES22, DIFF_EVEN22, True, True).save("out3-5-2.png")
    1513     test351(gradient256bw, ERROR_FSTEIN,
    1514             LINES22, DIFF_EVEN22, True, True).save("grad3-5-2.png")
    1515 
     1520
     1521    test351(grad256bw, ERROR_FSTEIN,
     1522            TILES33, DIFF_EVEN33, True, True).save("grad3-5-3.png")
    15161523    test351(lenna256bw, ERROR_FSTEIN,
    15171524            TILES33, DIFF_EVEN33, True, True).save("out3-5-3.png")
    1518     test351(gradient256bw, ERROR_FSTEIN,
    1519             TILES33, DIFF_EVEN33, True, True).save("grad3-5-3.png")
    1520 
     1525
     1526    test351(grad256bw, ERROR_FSTEIN,
     1527            TILES22, DIFF_EVEN22, True, True).save("grad3-5-4.png")
    15211528    test351(lenna256bw, ERROR_FSTEIN,
    15221529            TILES22, DIFF_EVEN22, True, True).save("out3-5-4.png")
    1523     test351(gradient256bw, ERROR_FSTEIN,
    1524             TILES22, DIFF_EVEN22, True, True).save("grad3-5-4.png")
    15251530
    15261531    mat = [[0, 0, -1, -1, 6*7./256, 5*7./256],
     
    15301535    Svg(mat).save("fig3-5-5.png", 40)
    15311536
     1537    test351(grad256bw, ERROR_FSTEIN,
     1538            TILES22, DIFF_WEIGHED22, True, False).save("grad3-5-5.png")
    15321539    test351(lenna256bw, ERROR_FSTEIN,
    15331540            TILES22, DIFF_WEIGHED22, True, False).save("out3-5-5.png")
    1534     test351(gradient256bw, ERROR_FSTEIN,
    1535             TILES22, DIFF_WEIGHED22, True, False).save("grad3-5-5.png")
    15361541
    15371542##############################################################################
     
    15571562
    15581563if chapter(4):
     1564    test401(grad256bw, DITHER_BAYER88).save("grad4-0-1.png")
    15591565    test401(lenna256bw, DITHER_BAYER88).save("out4-0-1.png")
    1560     test401(gradient256bw, DITHER_BAYER88).save("grad4-0-1.png")
    15611566
    15621567# Output 4.0.2: standard Floyd-Steinberg, 3 colours
     
    15671572    rows = len(mat[0])
    15681573    offset = mat[0].index(-1)
    1569     ey = [[0.] * (w + rows - 1) for x in range(lines)]
     1574    ey = Matrix(w + rows - 1, lines, 0.)
    15701575    for y in range(h):
    15711576        ex = [0.] * (rows - offset)
     
    15991604
    16001605if chapter(4):
     1606    test402(grad256bw, ERROR_FSTEIN, True).save("grad4-0-2.png")
    16011607    test402(lenna256bw, ERROR_FSTEIN, True).save("out4-0-2.png")
    1602     test402(gradient256bw, ERROR_FSTEIN, True).save("grad4-0-2.png")
    16031608
    16041609# Pattern 4.1.1: gamma-corrected 50% grey, black-white halftone, 50% grey
     
    16241629    rows = len(mat[0])
    16251630    offset = mat[0].index(-1)
    1626     ey = [[0.] * (w + rows - 1) for x in range(lines)]
     1631    ey = Matrix(w + rows - 1, lines, 0.)
    16271632    for y in range(h):
    16281633        ex = [0.] * (rows - offset)
     
    16561661
    16571662if chapter(4):
     1663    test42x(grad256bw, ERROR_FSTEIN, True, Gamma.Cto2).save("grad4-2-1.png")
    16581664    test42x(lenna256bw, ERROR_FSTEIN, True, Gamma.Cto2).save("out4-2-1.png")
    1659     test42x(gradient256bw, ERROR_FSTEIN, True, Gamma.Cto2).save("grad4-2-1.png")
     1665    test42x(grad256bw, ERROR_FSTEIN, True, Gamma.Cto3).save("grad4-2-2.png")
    16601666    test42x(lenna256bw, ERROR_FSTEIN, True, Gamma.Cto3).save("out4-2-2.png")
    1661     test42x(gradient256bw, ERROR_FSTEIN, True, Gamma.Cto3).save("grad4-2-2.png")
     1667    test42x(grad256bw, ERROR_FSTEIN, True, Gamma.Cto4).save("grad4-2-3.png")
    16621668    test42x(lenna256bw, ERROR_FSTEIN, True, Gamma.Cto4).save("out4-2-3.png")
    1663     test42x(gradient256bw, ERROR_FSTEIN, True, Gamma.Cto4).save("grad4-2-3.png")
    16641669
    16651670##############################################################################
     
    18951900                        groups[p] = [(i, j)]
    18961901            # Step 2: create the ranked dither
    1897             ranked = [[0] * dx for j in range(dy)]
     1902            ranked = Matrix(dx, dy)
    18981903            for p, g in groups.items():
    18991904                n = (int)(round(p * len(g)))
     
    19131918if chapter(2):
    19141919    #test26x(lenna256bw, DITHER_BAYER88).save("out2-6-1.png")
    1915     #test26x(gradient256bw, DITHER_BAYER88).save("grad2-6-1.png")
     1920    #test26x(grad256bw, DITHER_BAYER88).save("grad2-6-1.png")
    19161921    test26x(lenna256bw, DITHER_CLUSTER88).save("out2-6-1.png")
    1917     test26x(gradient256bw, DITHER_CLUSTER88).save("grad2-6-1.png")
    1918 
     1922    test26x(grad256bw, DITHER_CLUSTER88).save("grad2-6-1.png")
     1923
Note: See TracChangeset for help on using the changeset viewer.