2017-03-12 5 views
0

Ich versuche den Bildkontrast ohne Verwendung von Python-Bibliotheken herzustellen. Persönlich finde ich es besser zu lernen, wie man programmiert, ohne die verschiedenen Bibliotheken zu benutzen, um ein besseres Verständnis zu bekommen. In meinem Fall versuche ich zu vermeiden, opencv zu verwenden, um ein Bild zu kontrastieren.Einstellen des Kontrastes eines Bildes

Das Problem, das ich habe, ist TypeError: 'int' object has no attribute '__getitem__'. Ehrlich gesagt bin ich nicht ganz sicher, was dieser Fehler bedeutet.

import matplotlib.pylab as plt 
import matplotlib.image as mpimg 
import numpy as np 

img = np.uint8(mpimg.imread('igloo.png')) 

img = np.uint8((0.2126* img[:,:,0]) + \ 
    np.uint8(0.7152 * img[:,:,1]) +\ 
     np.uint8(0.0722 * img[:,:,2])) 

def img_contrast(img): 
    for x in range(img.size[0]): 
     for y in range(img.size[1]): 
      if (x, y) > 128: 
       (r, g, b) = img.getpixel((x, y)) 
       img.putpixel((x, y), (r+80, g+80, b+80)) 
      else: 
       if(x, y) < 128: 
       (r, g, b) = img.getpixel((x, y)) 
       img.putpixel((x, y), (r-80, g-80, b-80)) 

tam = img_contrast(img) 

plt.imshow(tam) 
+0

'if (x, y)> 128:' Dies kann das Problem sein, wenn Sie ein Tupel mit einer Ganzzahl vergleichen. –

+1

Von dem, was ich sagen kann, verwenden Sie bereits: 'pylab, matplotlib, numpy'. Was meinst du mit "_ohne Verwendung von Python-Bibliotheken_". – abccd

+0

Ansonsten sollten Sie PIL oder Pillow (Python-Image-Bibliothek) auschecken. Es hat einige nützliche Funktionen – abccd

Antwort

1

Ihr Code hat eine Menge Probleme darin, aber die, die Sie in dem ersten ausgeführt ist, dass Sie img.shape statt img.size Aufruf werden sollen, aber das ist wirklich die Spitze des Eisbergs.

Ich bin nicht sicher, was Ihre ursprüngliche Absicht war, aber hier Code ist, das funktioniert und sieht aus wie es ist etwas, um den Kontrast zu tun im Zusammenhang (auch wenn die Farben auf seltsame Weise ändern sich):

Code:

import pylab as plt 
import matplotlib.image as mpimg 
import numpy as np 


#Read in the image and make it ints for some reason 
#(Normally they are floats between 0 and 1 which is why mult by 256) 
img = 255*mpimg.imread('igloo.png') 

img[:,:,0] = 0.2126*img[:,:,0] #Red 
img[:,:,1] = 0.7152*img[:,:,1] #Green 
img[:,:,2] = 0.0722*img[:,:,2] #Blue 
           #Last channel is Alpha (transparency) 

def img_contrast(img): 
    rows,cols,channels = img.shape 
    for x in range(rows): 
     for y in range(cols): 
      if img[x,y,:3].mean > 128: 
       (r, g, b) = img[x,y,:3] 
       img[x,y,:3] = (r+80, g+80, b+80) 
      else: 
       (r, g, b) = img[x,y,:3] 
       img[x,y,:3] = (r-80, g-80, b-80) 

    return img 

#Pass the numpy img through the function, then convert it back to floats between 0 and 1 
tam = img_contrast(img) 
plt.imshow(tam/255) 
plt.show() 

Bild vor: Before

Bild nach: After

+0

sollten Sie nicht stattdessen mit 255 multiplizieren/dividieren? – Lakedaemon

+0

@Lakedaemon du bist definitiv richtig, danke und bearbeitet – mitoRibo