2017-12-14 2 views
1

Ich versuche ein Kreuzstichmuster mit Python zu erstellen, wie im angehängten Bild gezeigt.Automatisches Kreuzstichmuster

Bisher habe ich einfach das Pixelbild. Ich könnte es in Excel importieren und manuell Gitter und Farben etc. hinzufügen. Aber wie kann ich das in Python 'leicht' automatisieren? Kann ich irgendeine der normalen Funktionen zum Plotten von Figuren verwenden (pyplot), oder sollte ich in tkinter schauen?

Ich bin ziemlich ok machen Skripte in Python für technische Zwecke, aber völlig neu in GUI-Zeug.

Idealerweise würde meine Ausgabe ein vektorisiert pdf sein

Cross stitch pattern

from scipy import misc 
import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib.ticker as plticker 

arr = misc.imread('Fox_drawing_pixelized.png', mode= 'RGBA') # 640x480x3 array 

fig = plt.figure() 
imgplot = plt.imshow(arr) # RGBA 
ax = plt.gca() 
ax.grid(True) 
ax.grid(b=True, which='major', color='b', linestyle='-') 
plt.minorticks_on() 
loc = plticker.MultipleLocator(base=1) 
ax.xaxis.set_minor_locator(loc) 
ax.yaxis.set_minor_locator(loc) 
ax.grid(b=True, which='minor', color='k', linestyle='-',linewidth=.3) 
fig.savefig("foo.pdf", bbox_inches='tight') 
  • Wie stelle ich die Rasterlinien bei 0,5 anstatt auf die Einheiten (in der Mitte durch jedes Pixel)?

  • Wie zeichne ich Text durch jedes Pixel, habe ich bereits das Bild in einem Array mit Zahlen, wie man dies auf der Oberseite plotten?

+1

nicht klar, was das Problem ist. Matplotlib kann Gitter erstellen, es kann Text oder andere Symbole zeichnen, es kann Bildfelder färben, es kann PDF exportieren. Das sollte also geradlinig sein. (Ich verstehe nicht, was das mit GUI zu tun hat, wenn die Ausgabe pdf sein soll.) Wenn Sie ein Problem haben, zeigen Sie ein [mcve] des Problems (kein vollständiges Tier) und geben Sie klar an welcher Stelle Sie stecken . – ImportanceOfBeingErnest

+0

Zunächst können Sie Ihr Bild mit 'PIL' öffnen und dann' numpy.asarray (image) 'verwenden, um es in ein Array zu konvertieren, das Sie mit' pyplot.imshow' anzeigen können. –

+0

Danke, ich habe die Frage bearbeitet. Ich hatte die IMG gezeichnet, aber war nicht sicher für die Beschriftung, wenn Matplotlib der Weg ist. Ich hatte einige Sudoku-Beispiele mit tkinter gesehen, also dachte ich mir, das wäre eine gute Basis, um damit anzufangen. – user1908460

Antwort

0
  • die Rasterlinien verschieben, geben Sie einfach die Zecken Position ändern können:
    ax.set_xticks(np.arange(-0.5, arr.shape[1], 5))
    wird legte einen großen tick jeweils 5 Pixel von der Grenze des ersten Pixels zu starten.
    ax.set_xticks(np.arange(-0.5, arr.shape[1], 1), minor=True)
    macht das gleiche aber jedes Pixel für kleine Ticks. Und dann mach das gleiche für y aber mit arr.shape[0].

  • Um Text hinzuzufügen, können Sie einfach ax.text(x, y, 'text') verwenden. Ich habe ein Wörterbuch verwendet, um die Farben (im Hex-Format, da Rgb-Listen keine Wörterbuchschlüssel sein können) mit den Texten abzugleichen. Worauf Sie achten müssen, ist, dass (i, j) Matrixindizes den (y, x) Koordinaten entsprechen.

Hier ist der vollständige Code:

from scipy import misc 
import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib.ticker as plticker 
from matplotlib.colors import to_hex 

arr = misc.imread('image.png', mode= 'RGB') # array 
# adapt figure size to the image size. 
fig = plt.figure(figsize=(0.2*arr.shape[1], 0.2*arr.shape[0])) 
imgplot = plt.imshow(arr) # RGB 
ax = plt.gca() 
ax.grid(True) 
ax.grid(b=True, which='major', color='b', linestyle='-') 
plt.minorticks_on() 
ax.grid(b=True, which='minor', color='k', linestyle='-',linewidth=.3) 

# put a major gridline every 5 pixels 
ax.set_xticks(np.arange(-0.5, arr.shape[1], 5)) 
ax.set_yticks(np.arange(-0.5, arr.shape[0], 5)) 
# set ticks label 
ax.set_xticklabels(np.arange(0, arr.shape[1], 5)) 
ax.set_yticklabels(np.arange(0, arr.shape[0], 5)) 
# put a minor gridline every pixel 
ax.set_xticks(np.arange(-0.5, arr.shape[1], 1), minor=True) 
ax.set_yticks(np.arange(-0.5, arr.shape[0], 1), minor=True) 
fig.tight_layout(pad=0) # reduce space around image 

# display text 
colors_to_text = {'#000000': 'B', '#ffffff': 'W', '#f58a35': 'O', '#bcbbbb': 'G'} 

for i in range(arr.shape[0]): 
    for j in range(arr.shape[1]): 
     # get the text corresponding to the pixel color 
     txt = colors_to_text.get(to_hex(arr[i,j]/255), '') 
     # display text (x, y are inverted compared to the i, j indexes of the matrix) 
     ax.text(j, i, txt, color='#888888', horizontalalignment='center', 
       verticalalignment='center', fontsize=7) 

fig.savefig("foo.pdf", bbox_inches='tight') 

Das Bild pixelated image hat mir dieses Ergebnis: result

+0

@ user1908460 Ich denke, es ist mit der Größe der Figur gegenüber der Größe des Bildes korreliert. Wenn die Pixelgröße in der Figur zu klein ist, ist das Rendering selbst in PDF nicht gut. Versuchen Sie, die Bildgröße an die Bildgröße anzupassen (ich habe die Antwort aktualisiert) –