2017-05-30 1 views
-3

Ich schrieb einen kleinen Code zu Versuch, um ein Bild mit nur einem schwarzen Punkt pro Y-Wert zu erstellen, aber es erstellt mehr als eins pro Y-Wert. Das Bild ->the output imagefür Schleife macht seltsame Dinge Python

das Bild ist klein, aber Sie können sehen, dass es mehr als einen schwarzen Punkt pro Y-Wert geben kann. Der tatsächliche Code:

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) 

Normalerweise, wenn es anhängt einen schwarzen Punkt, dot wahr wird, so kann es nicht eine andere schwarzer Punkt, bevor die nächste Reihe von Pixeln sein. Warum funktioniert das nicht?

EDIT: exemple des gewünschten Ausgangs ->desired output

+0

Willkommen bei Stackoverflow. Bitte lesen und befolgen Sie die Buchungsrichtlinien in der Hilfe. [Minimales, vollständiges, überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) gilt hier. Wir können Ihnen nicht effektiv helfen, bis Sie Ihren MCVE-Code veröffentlicht und das Problem genau beschrieben haben. Wir sollten in der Lage sein, Ihren gesendeten Code in eine Textdatei einzufügen und das beschriebene Problem zu reproduzieren. – Prune

+0

Wo ist die Ausgabe von Ihren Debugging-Traces? Wenn nichts anderes, sollten Sie ein paar strategisch platzierte 'print'-Anweisungen einfügen und die Punkte beim Generieren ablegen. Sehen Sie diesen schönen [debug] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) Blog für Hilfe. – Prune

+0

Es ist nicht klar, was Sie fragen. Verwenden Sie vielleicht 'continue' in Ihrer' for' Schleife, wenn Sie einen schwarzen Punkt finden? Was ist der Zweck der Zufallszahl? Es scheint, dass Ihr Code so eingestellt ist, dass er Verstöße gegen das, was ich verstehe, mit einigen zufälligen Möglichkeiten akzeptiert. – roganjosh

Antwort

2

Ihre Reihe wird für die Bereichsbreite eingestellt und Ihre Spalte ist die Höhe, die mit xrange(width)xrange(height) ändern und umgekehrt, dann sollte das Bild ausgegeben werden, wie gewünscht.

So wie es aussieht, sucht es nach 10 Spalten für einen Punkt im Gegensatz zu den 50, die es suchen sollte.

EDIT 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") 

Wenn Sie numpy installieren können, können Sie ein Array erstellen, füllen Sie es zeilenweise, da Sie eine Spalte mit einem zufälligen 1 (Punkt) in anhängen und dann drehen das Array zur Querformatausrichtung.

Ausgänge ->enter image description here

+0

Ich habe versucht, mit welcher for-Schleife zuerst und alle außer der Reihenfolge zu schreiben in gibt die nächste gewünschte Ausgabe, alles andere macht die Materie schlechter – Tissuebox

+0

Ich sage nicht, um die Reihenfolge der Schleifen zu ändern, nur um die Werte in der 'xrange' Aufruf zu ersetzen, sollte alles andere gleich bleiben. – njoosse

+0

danke für diese Antwort, ich glaube eigentlich, das Problem ist mit dem Append, wie die Liste von oben links nach rechts gelesen wird zuerst nach rechts gehen und wie ich es geschrieben habe, fügte ich den Y-Wert (von oben nach unten) dann Gehen Sie rechts auf der X-Achse – Tissuebox

0

so finde ich, was das Problem war, die PutData (Liste) Funktion Schreib von links nach rechts und dann von oben nach unten auf dem Bild, aber meine Funktion versucht, von oben nach anhängen zu unten dann von links nach rechts, damit es nicht die richtige Ausgabe erzeugt. Um das zu beheben, fülle ich die Liste mit weißer Farbe (Breite * Höhe mal) und verändere dann die Farbe in der Liste mit [col * width + row] Formel. der Code:

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) 

der Ausgang ->output

Verwandte Themen