2017-05-30 121 views
-3

我寫了一小段代碼到嘗試來創建一個圖像,每個Y值只有一個黑點,但是它會爲每個Y值創建一個以上的黑點。圖像 - >the output imagefor循環做奇怪的事情python

圖像很小,但您可以看到每個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

+0

歡迎StackOverflow的。請閱讀並遵守幫助文檔中的發佈準則。 [最小,完整,可驗證的示例](http://stackoverflow.com/help/mcve)適用於此處。在發佈您的MCVE代碼並準確描述問題之前,我們無法爲您提供有效的幫助。 我們應該能夠將發佈的代碼粘貼到文本文件中,並重現您描述的問題。 – Prune

+0

調試線路的輸出在哪裏?如果沒有其他的東西,你應該插入一些戰略性地放置的'print'語句,並在生成它們時轉儲這些點。看到這個可愛的[debug](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)博客尋求幫助。 – Prune

+0

目前還不清楚你在問什麼。當你找到一個黑點時,也許在你的for循環中使用'continue'?隨機數的目的是什麼?看起來你的代碼被設置爲接受違反我所瞭解的是你的標準,並有一些隨機的可能性。 – roganjosh

回答

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

+0

我試着玩循環的第一和所有,但我寫它的順序in給出最接近的期望輸出,其他任何事情都會讓事情變得更糟 – Tissuebox

+0

我並不是說要改變循環的順序,只是爲了替換'xrange'調用中的值,其他的都應該保持不變。 – njoosse

+0

謝謝你的回答,我實際上認爲問題是附加問題,因爲從左上角讀取列表到右下角首先讀取,當我寫入時,我添加了Y值(從上到下),然後在X軸上右轉 – Tissuebox

0

讓我發現了什麼問題,該putdata(名單)函數寫從左到右然後從上到下的圖像,但我的函數試圖從上方追加到然後從左到右,所以它不會創建正確的輸出。爲了解決這個問題,我使用白色填充列表(寬度*高度時間),然後使用[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) 

輸出 - >output