for循环做奇怪的事情python

时间:2017-05-30 16:06:46

标签: python for-loop python-imaging-library

我写了一些代码来尝试来创建一个每个Y值只有一个黑点的图像,但每个Y值创建的图像多一个。图像 - > the output image

图像很小,但您可以看到每个Y值可能有多个黑点。实际代码:

from PIL import Image
from random import *
from math import *

white = (255,255,255)
black = (0,0,0)

width = 50
height = 10
num = 0
def line(num):
    mylist = []
    a = Image.new("RGB", (width, height))
    for row in xrange(width):
        dot = False
        for col in xrange(height):
            rand = random()
            b = float(col)/(width-1)
            if b > rand and not dot:
                mylist.append(black)
                dot = True
            else:
                mylist.append(white)
    a.putdata(mylist)
    a.save("boop"+str(num)+".png")

line(num)

通常当它附加一个黑点时,dot变为真,所以在下一行像素之前不能有另一个黑点。为什么这不起作用?

编辑:所需输出的例子 - > desired output

2 个答案:

答案 0 :(得分:2)

您的行设置为范围宽度,列是高度,使用xrange(width)更改xrange(height),反之亦然,然后根据需要输出图像。

就目前而言,它正在检查一个点的10列而不是它应该寻找的50列。

编辑3

import numpy as np

#other declarations as above#

def line(num):
    mylist = np.zeros((width, height))
    for row in mylist:
        row[randint(0,9)] = 1
    npArr = mylist.T
    a = Image.new("RGB", (width, height))
    mylist = []
    for idx, val in np.ndenumerate(npArr):
        if val == 1:
            mylist.append(black)
        else:
            mylist.append(white)
    a.putdata(mylist)
    a.save("boop"+str(num)+".png")

如果你可以安装numpy,你可以创建一个数组,然后按行填充它,因为你可以在其中附加一个随机1(点)的列,然后将数组旋转到横向。

输出 - > enter image description here

答案 1 :(得分:0)

所以我发现问题是什么,putdata(list)函数从左到右然后从上到下写在图像上但是我的函数试图从上到下然后从左到右追加所以它没有创建正确的输出。为了解决这个问题,我用白色填充列表(宽度*高度倍数),然后用[col * width + row]公式更改列表中颜色的更改。代码:

width = 50
height = 10
num = 0
mylist = []
def line(num):
    a = Image.new("RGB", (width, height))
    for pixel in xrange(width*height):
        mylist.append(white)
    for row in xrange(width):
        dot = False
        for col in xrange(height):
            rand1 = random()
            rand2 = random()
            b = float(col)/(height-1)
            if rand1 < b < rand2 and not dot:
                mylist[col*width+row] = black
                dot = True
            if col == height-1 and not dot:
                rand3 = randint(0, height-1)
                mylist[rand3*width+row] = black
    a.putdata(mylist)
    a.save("boop"+str(num)+".png")

line(num)

输出 - &gt; output