2017-02-07 9 views
1

Итак, у меня есть программа обработки изображений, и я работал над ней на рабочем столе Win7. Одной из его функций является изменение контрастности изображения, которое пользователь выбирает. Он отлично работает на рабочем столе Win7, но когда я переношу его на свой ноутбук на Win10, он делает переполнение красного значения. Это результат на ноутбуке Win10:Выполнение python для разных устройств

wrong obama

И это один на Win7 рабочем столе:

good obama

Это функция, которая меняет Контраст:

def change_contrast(level): 

    img = Image.open(a) 
    img.load() 

    factor = (259 * (level+255))/(255 * (259-level)) 
    for x in range(img.size[0]): 
     for y in range(img.size[1]): 
      color = img.getpixel((x, y)) 
      new_color = tuple(int(factor * (c-128) + 128) for c in color) 
      img.putpixel((x, y), new_color) 

    return img 

Вот полный код в случае необходимости:

from tkinter import* 
import tkinter as Tkinter 
from tkinter import filedialog, DISABLED, messagebox as tkMessageBox 
import os 
import ntpath 
from PIL import Image, ImageTk, ImageFilter 
import PIL 
from collections import Counter 
from random import randint 
import random 
import PIL.ImageOps 


def EchelleDeGris(): 
    Ima2=Image.new("RGB",(z[0],z[1])) 
    px=Ima1.load() 
    px1=Ima2.load() 
    for x in range(z[0]): 
     for y in range(z[1]): 
      p=px[x,y] 
      if type(p)==int: 
       p=(p,p,p) 
      o=int((p[0]+p[1]+p[2])/3) 
      px1[x,y]=(o,o,o) 
    Ima2.save(""+dir_path+"\\Requirements\\ImageMod.png") 
    im2 = ImageTk.PhotoImage(file=""+dir_path+"\\Requirements\\ImageMod.png") 
    main.image = im2 
    I2 = Tkinter.Label(main, image=im2) 
    I2.grid(row=0, column=4, columnspan =4) 

def SupprimerImage(): 
    I2 = Tkinter.Label(main, image=imt) 
    I2.grid(row=0, column=4, columnspan =4) 

def Luminosite(): 
    Ima2=Image.new("RGB",(z[0],z[1])) 
    px=Ima1.load() 
    px1=Ima2.load() 
    for x in range(z[0]): 
     for y in range(z[1]): 
      p=px[x,y] 
      if type(p)==int: 
       p=(p,p,p) 
      px1[x,y]=(p[0]+S1.get(),p[1]+S1.get(),p[2]+S1.get()) 
    Ima2.save(""+dir_path+"\\Requirements\\ImageMod.png") 
    im2 = ImageTk.PhotoImage(file=""+dir_path+"\\Requirements\\ImageMod.png") 
    main.image = im2 
    I2 = Tkinter.Label(main, image=im2) 
    I2.grid(row=0, column=4, columnspan =4) 

def AnnulerModifications(): 
    I2 = Tkinter.Label(main, image=im1) 
    I2.grid(row=0, column=4, columnspan =4) 

def get_pixel(pixels, x, y): 
    try: 
     return pixels[x, y] 
    except IndexError: 
     return None 


def get_neighbors(pixels, x, y): 
    neighbors = list() 
    neighbors.append(get_pixel(pixels, x, y - 1)) 
    neighbors.append(get_pixel(pixels, x, y + 1)) 
    neighbors.append(get_pixel(pixels, x - 1, y)) 
    neighbors.append(get_pixel(pixels, x + 1, y)) 
    neighbors.append(get_pixel(pixels, x - 1, y - 1)) 
    neighbors.append(get_pixel(pixels, x - 1, y + 1)) 
    neighbors.append(get_pixel(pixels, x + 1, y - 1)) 
    neighbors.append(get_pixel(pixels, x + 1, y + 1)) 
    return neighbors 


def filter_art(pixels, size): 
    indexes = dict() 
    for x in range(size[0]): 
     for y in range(size[1]): 
      color = get_pixel(pixels, x, y) 
      neighbors = get_neighbors(pixels, x, y) 
      new_color = Counter(neighbors).most_common()[0][0] 
      if new_color is not None: 
       indexes[x, y] = new_color 
    for x, y in indexes: 
     pixels[x, y] = indexes[x, y] 


def pop_art(path_orig, path_mod, coef): 

    s=[] 
    for i in range(9): 

     r=(randint(0,255), randint(0,255), randint(0,255)) 
     g=(randint(0,255), randint(0,255), randint(0,255)) 
     b=(randint(0,255), randint(0,255), randint(0,255)) 

     image_orig = Image.open(path_orig) 
     size = image_orig.size 
     image_mod = Image.new("RGB",(size[0],size[1])) 
     pixels_orig = image_orig.load() 
     pixels_mod = image_mod.load() 
     for x in range(size[0]): 
      for y in range(size[1]): 
       p = pixels_orig[x, y] 
       if isinstance(p, int): 
        rgb = (p,p,p) 
       elif isinstance(p, tuple) and len(p) in (3, 4): 
        rgb = p[:3] 
       else: 
        raise TypeError('Unknown pallete') 
       average_color = sum(rgb)/3 
       if average_color <= 85: 
        pixels_mod[x, y] = r 
       elif 85 < average_color <= 170: 
        pixels_mod[x, y] = g 
       elif average_color > 170: 
        pixels_mod[x, y] = b 
     for _ in range(coef): 
      filter_art(pixels_mod, size) 
     image_mod.save(''+dir_path+'\\PopArt\\Modified Images\\result'+str(i)+'.png') 
     Img=[None]*9 
    for i in range(9): 
     Img[i]=Image.open(""+dir_path+"\\PopArt\\Modified Images\\result"+str(i)+".png") 
     basewidth = int(Img[i].size[1]/3) 
     wpercent = (basewidth/float(Img[i].size[0])) 
     hsize = int((float(Img[i].size[1]) * float(wpercent))) 
     Img[i] = Img[i].resize((basewidth , hsize), PIL.Image.ANTIALIAS) 
     Img[i].save(''+dir_path+'\\PopArt\\Resized Images\\resized_image'+str(i)+'.png') 


    Img1=[None]*9 
    pixels1=[None]*9 
    Imaz=Image.new("RGB",(basewidth*3,hsize*3)) 
    pixels=Imaz.load() 
    for i in range(9): 
     Img1[i]=Image.open(''+dir_path+'\\PopArt\\Resized Images\\resized_image'+str(i)+'.png') 
     pixels1[i]=Img1[i].load() 


    for x in range(0,basewidth): 
     for y in range(0,hsize): 
      pixels[x,y]=pixels1[0][x,y] 
     for y in range(hsize,hsize*2): 
      pixels[x,y]=pixels1[1][x,y-hsize] 
     for y in range(hsize*2,hsize*3): 
      pixels[x,y]=pixels1[2][x,y-hsize*2] 

    for x in range(basewidth,basewidth*2): 
     for y in range(0,hsize): 
      pixels[x,y]=pixels1[3][x-basewidth,y] 
     for y in range(hsize,hsize*2): 
      pixels[x,y]=pixels1[4][x-basewidth,y-hsize] 
     for y in range(hsize*2,hsize*3): 
      pixels[x,y]=pixels1[5][x-basewidth,y-hsize*2] 

    for x in range(basewidth*2,basewidth*3): 
     for y in range(0,hsize): 
      pixels[x,y]=pixels1[6][x-basewidth*2,y] 
     for y in range(hsize,hsize*2): 
      pixels[x,y]=pixels1[7][x-basewidth*2,y-hsize] 
     for y in range(hsize*2,hsize*3): 
      pixels[x,y]=pixels1[8][x-basewidth*2,y-hsize*2] 
    Imaz = Imaz.resize((size[0] , size[1]), PIL.Image.ANTIALIAS) 
    Imaz.save(""+dir_path+"\\PopArt\\Result Image\\result.png") 


def usepop(): 
    im2 = ImageTk.PhotoImage(file=""+dir_path+"\\Requirements\\traitement.png") 
    main.image = im2 
    I2 = Tkinter.Label(main, image=im2) 
    I2.grid(row=0, column=4, columnspan =4) 
    I2.update_idletasks() 
    pop_art(a, None, coef=4) 
    im2 = ImageTk.PhotoImage(file=""+dir_path+"\\PopArt\\Result Image\\result.png") 
    main.image = im2 
    I2 = Tkinter.Label(main, image=im2) 
    I2.grid(row=0, column=4, columnspan =4) 

def change_contrast(level): 

    img = Image.open(a) 
    img.load() 

    factor = (259 * (level+255))/(255 * (259-level)) 
    for x in range(img.size[0]): 
     for y in range(img.size[1]): 
      color = img.getpixel((x, y)) 
      new_color = tuple(int(factor * (c-128) + 128) for c in color) 
      img.putpixel((x, y), new_color) 

    return img 

def use_contrast(): 
    result = change_contrast(S2.get()) 
    result.save(""+dir_path+"\\Requirements\\ImageMod.png") 
    im2 = ImageTk.PhotoImage(file=""+dir_path+"\\Requirements\\ImageMod.png") 
    main.image = im2 
    I2 = Tkinter.Label(main, image=im2) 
    I2.grid(row=0, column=4, columnspan =4) 

def recherche_contours(): 
    Ima2=Image.new("RGB",(z[0],z[1])) 
    px=Ima1.load() 
    px1=Ima2.load() 
    for x in range(z[0]): 
     for y in range(z[1]): 
      p=px[x,y] 
      if type(p)==int: 
       p=(p,p,p) 
      o=int((p[0]+p[1]+p[2])/3) 
      px1[x,y]=(o,o,o) 
    Ima2 = Ima2.filter(ImageFilter.FIND_EDGES) 
    image = Ima2 
    if image.mode == 'RGBA': 
     r,g,b,a = image.split() 
     rgb_image = Image.merge('RGB', (r,g,b)) 

     inverted_image = PIL.ImageOps.invert(rgb_image) 

     r2,g2,b2 = inverted_image.split() 

     final_transparent_image = Image.merge('RGBA', (r2,g2,b2,a)) 

     final_transparent_image.save(""+dir_path+"\\Requirements\\ImageMod.png") 

    else: 
     inverted_image = PIL.ImageOps.invert(image) 
     inverted_image.save(""+dir_path+"\\Requirements\\ImageMod.png") 
    im2 = ImageTk.PhotoImage(file=""+dir_path+"\\Requirements\\ImageMod.png") 
    main.image = im2 
    I2 = Tkinter.Label(main, image=im2) 
    I2.grid(row=0, column=4, columnspan =4) 

main=Tk() 

main.withdraw() 
a = filedialog.askopenfilename() 
main.deiconify() 

dir_path = os.path.dirname(os.path.realpath("Test2.py")) 

main.configure(background="#a1dbcd") 
main.title("Photoshop Version.Megzari") 

Ima1=Image.open(a) 
z=Ima1.size 
nux=Image.new("RGB",(z[0],z[1])) 
nuxy=nux.load() 
for x in range(z[0]): 
    for y in range(z[1]): 
     nuxy[x,y]=(255,255,255) 
nux.save(""+dir_path+"\\Requirements\\Blank.png") 


if z>(400,400): 
    main.withdraw() 
    tkMessageBox.showinfo("Resolution Error", "The image is too big, please select a smaller one.") 
    sys.exit() 


elif z<(400,400): 
    im1 = ImageTk.PhotoImage(file=a) 
    I1 = Tkinter.Label(main, image=im1) 
    I1.grid(row=0, column=1, columnspan =3) 
    imt = ImageTk.PhotoImage(file=""+dir_path+"\\Requirements\\Blank.png") 
    T1 = Tkinter.Label(main, image=imt) 
    T1.grid(row=0, column=4, columnspan =4) 
    B1 = Tkinter.Button(main, text ="Echelle de gris", command = EchelleDeGris, fg="#a1dbcd", bg="#383a39", state=NORMAL) 
    B1.grid(padx=20, pady=20, row=1, column=0) 
    B3 = Tkinter.Button(main, text ="Appliquer Luminosité", command = Luminosite, fg="#a1dbcd", bg="#383a39") 
    B3.grid(padx=20, pady=20, row=1, column=1) 
    S1 = Scale(main, from_=0, to=254, orient=HORIZONTAL, fg="#a1dbcd", bg="#383a39", length = 200) 
    S1.grid(row=2, column=1) 
    B2 = Tkinter.Button(main, text ="Supprimer Image", command = SupprimerImage, fg="#a1dbcd", bg="#383a39") 
    B2.grid(padx=20, pady=20, row=1, column=7) 
    B3 = Tkinter.Button(main, text ="Annuler Modifications", command = AnnulerModifications, fg="#a1dbcd", bg="#383a39") 
    B3.grid(padx=20, pady=20, row=1, column=6) 
    B4 = Tkinter.Button(main, text ="Pop Art", command = usepop, fg="#a1dbcd", bg="#383a39") 
    B4.grid(padx=20, pady=20, row=1, column=3) 
    S2 = Scale(main, from_=-258, to=258, orient=HORIZONTAL, fg="#a1dbcd", bg="#383a39", length = 200) 
    S2.grid(row=2, column=4) 
    B4 = Tkinter.Button(main, text ="Appliquer Contraste", command = use_contrast, fg="#a1dbcd", bg="#383a39") 
    B4.grid(padx=20, pady=20, row=1, column=4) 
    B5 = Tkinter.Button(main, text ="Trouver Contours", command = recherche_contours, fg="#a1dbcd", bg="#383a39") 
    B5.grid(padx=20, pady=20, row=1, column=5) 

    s=S1.get() 
    s2=S2.get() 




main.mainloop() 

Я не знаю, почему это дает мне другой результат в зависимости от платформы, с которой я ее запускаю.

EDIT: Код, который использует PIL.ImageEnhance.Contrast:

from PIL import Image, ImageEnhance 
image = Image.open('E:\Projet Complet\Images\obama.png') 
contrast = ImageEnhance.Contrast(image) 
contrast_applied=contrast.enhance(1) 
image.show() 

На Win7 у меня есть Python 3.2.5 и 1.1.7 PIL,

А на Win10 У меня есть Python 3.4.5 и PIL 1,1 .7

+0

какой-либо причине вы не используете [ 'PIL.ImageEnhance.Contrast'] (http://pillow.readthedocs.io/en/3.1.x/reference/ImageEnhance .html # PIL.ImageEnhance.Contrast)? –

+0

В случае, если вы не заметили, мой код получает значение шкалы ('s2 = S2.get()') между '-258' и' 258' и создает контрастное изображение в зависимости от этого значения. С 'PIL.ImageEnhance.Contrast', я не могу настроить уровень контраста, он просто дает мне один улучшенный образ. –

+0

Он принимает число с плавающей запятой от '0.0' до' 1.0'. Это не обеспечивает выравнивание? –

ответ

0

Мне удалось найти способ решить эту проблему. Поскольку я пытался написать свою собственную функцию контрастности, некоторые различия в версии в конечном итоге дают такой результат. Поэтому вместо того, чтобы:

def change_contrast(level): 

    img = Image.open(a) 
    img.load() 

    factor = (259 * (level+255))/(255 * (259-level)) 
    for x in range(img.size[0]): 
     for y in range(img.size[1]): 
      color = img.getpixel((x, y)) 
      if type(color) == int: 
       color=(color,color,color) 
       new_color = tuple(int(factor * (c-128) + 128) for c in color) 
       new_color = new_color[0] 
       img.putpixel((x, y), new_color) 
      elif type(color) != int: 
       new_color = tuple(int(factor * (c-128) + 128) for c in color) 
       img.putpixel((x, y), new_color) 
    return img 

def use_contrast(): 
    result = change_contrast(S2.get()) 
    result.save(""+dir_path+"\\Requirements\\ImageMod.png") 
    im2 = ImageTk.PhotoImage(file=""+dir_path+"\\Requirements\\ImageMod.png") 
    main.image = im2 
    I2 = Tkinter.Label(main, image=im2) 
    I2.grid(row=0, column=4, columnspan =4) 

Вы можете использовать это:

def change_contrast(): 

    image = Image.open(a) 
    scale_value=S2.get() 
    contrast = ImageEnhance.Contrast(image) 
    contrast_applied = contrast.enhance(scale_value) 
    contrast_applied.save(""+dir_path+"\\Requirements\\ImageMod.png") 
    im2 = ImageTk.PhotoImage(file=""+dir_path+"\\Requirements\\ImageMod.png") 
    main.image = im2 
    I2 = Tkinter.Label(main, image=im2) 
    I2.grid(row=0, column=4, columnspan =4) 

И я заменить функцию на кнопку от use_contrast к только change_contrast. Это также намного короче и быстрее. Но для второго кода, вы должны написать from PIL import ImageEnhance