Frage

Ich habe an einem Drehbuch zu arbeiten, und ich muß es im Grunde:

  • Machen Sie das Bild Graustufen- (oder bitonale, werde ich mit beiden spielen zu sehen, die man besser funktioniert).
  • Prozess jede einzelne Spalte und schafft einen Netto-Intensitätswert für jede Spalte.
  • Spit die Ergebnisse in eine geordnete Liste.
Es ist eine wirklich einfache Möglichkeit, dies mit ImageMagick zu tun (auch wenn Sie ein paar Linux-Dienstprogramme müssen den Ausgabetext verarbeiten), aber ich bin nicht wirklich zu sehen, wie dies mit Python und PIL zu tun.

Hier ist, was ich bisher:

from PIL import Image

image_file = 'test.tiff'

image = Image.open(image_file).convert('L')

histo = image.histogram()
histo_string = ''

for i in histo:
  histo_string += str(i) + "\n"

print(histo_string)

Diese Ausgänge etwas (ich bin auf der Suche, die Ergebnisse grafisch darstellen), aber es sieht nichts, wie der ImageMagick-Ausgang. Ich verwende diese die Naht und den Inhalt eines gescannten Buches zu erkennen.

Danke an alle, die helfen!


Ich habe eine (böse aussehende) Lösung, die funktioniert, denn nun:

from PIL import Image
import numpy

def smoothListGaussian(list,degree=5):
  window=degree*2-1
  weight=numpy.array([1.0]*window)
  weightGauss=[]

  for i in range(window):
    i=i-degree+1
    frac=i/float(window)
    gauss=1/(numpy.exp((4*(frac))**2))
    weightGauss.append(gauss)

  weight=numpy.array(weightGauss)*weight
  smoothed=[0.0]*(len(list)-window)

  for i in range(len(smoothed)):
    smoothed[i]=sum(numpy.array(list[i:i+window])*weight)/sum(weight)

  return smoothed

image_file = 'verypurple.jpg'
out_file = 'out.tiff'

image = Image.open(image_file).convert('1')
image2 = image.load()
image.save(out_file)

intensities = []

for x in xrange(image.size[0]):
  intensities.append([])

  for y in xrange(image.size[1]):
    intensities[x].append(image2[x, y] )

plot = []

for x in xrange(image.size[0]):
  plot.append(0)

  for y in xrange(image.size[1]):
    plot[x] += intensities[x][y]

plot = smoothListGaussian(plot, 10)

plot_str = ''

for x in range(len(plot)):
  plot_str += str(plot[x]) + "\n"

print(plot_str)
War es hilfreich?

Lösung

Ich sehe, Sie verwenden numpy. Ich kann das Graustufenbild zu einer numpy Array konvertiert zuerst, dann verwenden numpy entlang einer Achse zu summieren. Bonus:. Sie werden wahrscheinlich feststellen, Ihre Glättungsfunktion läuft viel schneller, wenn Sie es zu beheben einen 1D-Array als Eingabe akzeptieren

>>> from PIL import Image
>>> import numpy as np
>>> i = Image.open(r'C:\Pictures\pics\test.png')
>>> a = np.array(i.convert('L'))
>>> a.shape
(2000, 2000)
>>> b = a.sum(0) # or 1 depending on the axis you want to sum across
>>> b.shape
(2000,)

Andere Tipps

die Dokumentation für PIL , histogram gibt Ihnen eine Liste von Pixelzählungen für jeden Pixelwert im Bild. Wenn Sie ein Graustufenbild haben, wird es 256 verschiedene mögliche Werte, von 0 bis 255, und die Liste von image.histogram zurückgegeben werden 256 Einträge haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top