0 / 0 / 0
Регистрация: 25.05.2015
Сообщений: 9

Применение фильтров к фото

04.06.2015, 00:07. Показов 7256. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
как к данному коду прикрутить меню выбора накладки фильтров на фото в точности:
1) накладку серого
Python
1
2
3
4
5
6
7
8
if (mode == 0):
    for i in range(width):
        for j in range(height):
            a = pix[i, j][0]
            b = pix[i, j][1]
            c = pix[i, j][2]
            S = (a + b + c) // 3
            draw.point((i, j), (S, S, S))
2)Негатив
Python
1
2
3
4
5
6
7
if (mode == 2):
    for i in range(width):
        for j in range(height):
            a = pix[i, j][0]
            b = pix[i, j][1]
            c = pix[i, j][2]
            draw.point((i, j), (255 - a, 255 - b, 255 - c))
3)и добавление шумов
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if (mode == 3):
    factor = int(input('factor:'))
    for i in range(width):
        for j in range(height):
            rand = random.randint(-factor, factor)
            a = pix[i, j][0] + rand
            b = pix[i, j][1] + rand
            c = pix[i, j][2] + rand
            if (a < 0):
                a = 0
            if (b < 0):
                b = 0
            if (c < 0):
                c = 0
            if (a > 255):
                a = 255
            if (b > 255):
                b = 255
            if (c > 255):
                c = 255
            draw.point((i, j), (a, b, c))
Ну и как сохранить потом эти изменения ?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from Tkinter import *
import Image, ImageTk, tkFileDialog, random, ImageDraw
from tkMessageBox import*
global img, imgobj
def show():
        global img, imgobj
                   
        filename = tkFileDialog.askopenfilename()
        if filename != ():  
                     
            src_img = Image.open(filename)
            img = ImageTk.PhotoImage(src_img)
            c.itemconfigure(imgobj, image=img, anchor="nw")
 
def callback():
    if askyesno('Verify', 'Really quit?'):
        tk.destroy()
    else:
        showinfo('No', 'Quit has been cancelled')
tk = Tk()
main_menu = Menu(tk)       
tk.config(menu=main_menu)  
file_menu = Menu(main_menu)  
main_menu.add_cascade(label="File", menu=file_menu)
file_menu.add_command(label="Open", command=show)
file_menu.add_separator()  
file_menu.add_command(label="Exit", command=callback)
c = Canvas(tk, width=300, height=300, bg="white")
imgobj = c.create_image(0, 0)
c.pack()
tk.mainloop()
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.06.2015, 00:07
Ответы с готовыми решениями:

Применение фильтров ОС UNIX
Привет, хотел попросить помочь с задачей. Нужно найти в подкаталоге файл, содержащий наибольшее количество строк. Я так понимаю надо...

Применение фильтров на изображение
Здравствуйте. Пишу программу для работы с массивом пикселей на bitmap. На форме есть picturebox в котором на bitmap помещено изображение....

Применение фильтров к graphics
Написал свою библиотек графического интерфейса с разделенным функционалом и представлением. Логика такая - есть компонент, он наследует...

7
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
04.06.2015, 00:33
Для начала оберни код в теги python и после этого уже поговорим.

P.S
и лучше не используй поганый tkinter и будет тебе счастье
0
0 / 0 / 0
Регистрация: 25.05.2015
Сообщений: 9
04.06.2015, 01:36  [ТС]
задание именно на ткинтер программу писать. мне досталось это чудо (

Добавлено через 19 минут
Python
1
2
3
4
5
6
def savef():
    op=asksaveasfilename()
    letter = ImageTk.PhotoImage.get(1.0,END)
    f = open(sa,'w')
    f.insert(letter)
    f.close
при попытке сохранить изображение пишет
NameError: global name 'asksaveasfilename' is not defined

Добавлено через 10 минут
нашел что за проблема с сохранением, неправильно FileDialog был импортирован

Добавлено через 8 минут
всеравно не выходит сохранить, неправильно функцию пишу
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
04.06.2015, 16:30
EvoLwe, Вот, немного облагороженная версия кода, тебе сюда только добавить твои методы обработки ихображения надо и всё.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import tkinter
import tkinter.messagebox
import tkinter.filedialog
 
from PIL import Image, ImageTk
 
 
class MainWindow(tkinter.Tk):
    def __init__(self):
        super().__init__()
        self.create_menu()
 
        self.display = tkinter.Canvas(self, width=500, height=450, bg="white")
        self.display_img = self.display.create_image(0, 0)
        self.display.pack()
 
    def create_menu(self):
        menu = tkinter.Menu(self)
        file_menu = tkinter.Menu(menu)
        menu.add_cascade(label="File", menu=file_menu)
 
        file_menu.add_command(label="Open", command=self.show)
        file_menu.add_command(label="Save", command=self.save)
        file_menu.add_separator()
        file_menu.add_command(label="Exit", command=self.close)
 
        self.config(menu=menu)
 
    def show(self):
        filename = tkinter.filedialog.askopenfilename()
        if filename:
            self.image = Image.open(filename)
            self.photo = ImageTk.PhotoImage(self.image)
            self.display.itemconfigure(self.display_img, image=self.photo, anchor="nw")
 
    def close(self):
        if tkinter.messagebox.askyesno('Verify', 'Really quit?'):
            self.destroy()
        else:
            tkinter.messagebox.showinfo('No', 'Quit has been cancelled')
 
    def save(self):
        path = tkinter.filedialog.asksaveasfilename()
        if path:
            try:
                self.image.save(path)
            except KeyError:
                tkinter.messagebox.showerror('Ошибка', 'Не задано расширение')
 
window = MainWindow()
window.geometry('500x450')
window.mainloop()
2
0 / 0 / 0
Регистрация: 25.05.2015
Сообщений: 9
05.06.2015, 01:40  [ТС]
alex925,а как указать, что я хочу именно на это изображение наложить фильтр ?

Добавлено через 2 часа 30 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import tkinter
import tkinter.messagebox
import tkinter.filedialog
 
from PIL import Image, ImageTk, ImageDraw
 
 
fileNameGlobal='globalimage'
 
class MainWindow(tkinter.Tk):
    def __init__(self):
        super().__init__()
        self.create_menu()
 
        self.display = tkinter.Canvas(self, width=2000, height=2000, bg="white")
        self.display_img = self.display.create_image(0, 0)
        self.display.pack()
 
    def create_menu(self):
        menu = tkinter.Menu(self)
        file_menu = tkinter.Menu(menu)
        edit_menu = tkinter.Menu(menu)
        menu.add_cascade(label="File", menu=file_menu)
        menu.add_cascade(label='Edit',menu=edit_menu)
        
        file_menu.add_command(label="Open", command=self.show)
        file_menu.add_command(label="Save", command=self.save)
        file_menu.add_separator()
        file_menu.add_command(label="Exit", command=self.close)
 
        edit_menu.add_command(label='grey',command=self.greyf)
        self.config(menu=menu)
 
    def show(self):
        filename = tkinter.filedialog.askopenfilename()
        fileNameGlobal=filename
        if filename:
            self.image = Image.open(filename)
            self.photo = ImageTk.PhotoImage(self.image)
            self.display.itemconfigure(self.display_img, image=self.photo, anchor="nw")
 
    def close(self):
        if tkinter.messagebox.askyesno('Verify', 'Really quit?'):
            self.destroy()
        else:
            tkinter.messagebox.showinfo('No', 'Quit has been cancelled')
 
    def save(self):
        path = tkinter.filedialog.asksaveasfilename()
        if path:
            try:
                self.image.save(path)
            except KeyError:
                tkinter.messagebox.showerror('Ошибка', 'Не задано расширение')
    def greyf(self):
       d=Image.open(fileNameGlobal)
       draw = ImageDraw.Draw(d)
       pix = d.load() 
       for i in range(pix.size[0]):
             for j in range(pix.size[1]):
                 a = pix[i, j][0]
                 b = pix[i, j][1]
                 c = pix[i, j][2]
                 S = (a + b + c) // 3
                 draw.point((i, j), (S, S, S))
       return d
window = MainWindow()
window.geometry('2000x2000')
window.mainloop()
я попробовал сделать как глобальную переменную изображение, всеравно не выходит наложить фильтр, просто ничего не происходит

Добавлено через 5 минут
теперь выдает ошибку
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python34\lib\tkinter\__init__.py ", line 1533, in __call__
return self.func(*args)
File "C:/Users/Vladislav/Desktop/test.py", line 56, in greyf
d=Image.open(fileNameGlobal)
File "C:\Python34\lib\site-packages\PIL\Image.py", line 2248, in open
fp = builtins.open(fp, "rb")
FileNotFoundError: [Errno 2] No such file or directory: 'imagecopy'
>>>
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
05.06.2015, 08:18
EvoLwe, Ты вызываешь методы не у тех объектов, что нужно + если хочешь чтобы картинка изменилась, то нужно загрузить изменения самому, за тебя это ни кто не сделает.
Вот примерно так, только нужно по идее какое нибудь уведомление прикрутить, когда идёт обработка фото + делать это в отдельном потоке:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import tkinter
import tkinter.messagebox
import tkinter.filedialog
 
from PIL import Image, ImageTk, ImageDraw
 
 
class MainWindow():
    def __init__(self, root):
        self.root = root
        self.create_menu()
 
        self.image = None
        self.photo = None
 
        self.display = tkinter.Canvas(root, width=500, height=450, bg="white")
        self.display_img = self.display.create_image(0, 0)
        self.display.pack()
 
    def create_menu(self):
        menu = tkinter.Menu(self.root)
 
        self.file_menu = tkinter.Menu(menu)
        menu.add_cascade(label="File", menu=self.file_menu)
        self.file_menu.add_command(label="Open", command=self.open)
        self.file_menu.add_command(label="Save", command=self.save, state='disabled')
        self.file_menu.add_separator()
        self.file_menu.add_command(label="Exit", command=self.close)
 
        self.edit_menu = tkinter.Menu(menu)
        menu.add_cascade(label="Edit", menu=self.edit_menu)
        self.edit_menu.add_command(label="Gray", command=self.grey, state='disabled')
 
        self.root.config(menu=menu)
 
    def open(self):
        filename = tkinter.filedialog.askopenfilename()
        if filename:
            self.image = Image.open(filename)
            self.photo = ImageTk.PhotoImage(self.image)
            self.display.itemconfigure(self.display_img, image=self.photo, anchor="nw")
 
            self.file_menu.entryconfig("Save", state='active')
            self.edit_menu.entryconfig("Gray", state='active')
 
    def close(self):
        if tkinter.messagebox.askyesno('Verify', 'Really quit?'):
            self.root.destroy()
        else:
            tkinter.messagebox.showinfo('No', 'Quit has been cancelled')
 
    def save(self):
        path = tkinter.filedialog.asksaveasfilename()
        if path:
            try:
                self.image.save(path)
            except KeyError:
                tkinter.messagebox.showerror('Ошибка', 'Не задано расширение')
 
    def grey(self):
        draw = ImageDraw.Draw(self.image)
        pix = self.image.load()
        for i in range(self.image.size[0]):
            for j in range(self.image.size[1]):
                average = (pix[i, j][0] + pix[i, j][1] + pix[i, j][2]) // 3
                draw.point((i, j), (average, average, average))
 
        self.photo = ImageTk.PhotoImage(self.image)
        self.display.itemconfigure(self.display_img, image=self.photo, anchor="nw")
 
 
root = tkinter.Tk()
window = MainWindow(root)
root.geometry('500x450')
root.mainloop()
я попробовал сделать как глобальную переменную
Забудь про использование глобальных переменных, это зло и точка!
К тому же какие нафиг глобальные переменные, когда код в ООП. Изображение хранится в атрибуте класса и следовательно получить к нему доступ не составляет проблем.

Кстати обрати внимание, что я использую объект изображения созданный при открытии файла, не нужно открывать изображение по 10 раз.
1
0 / 0 / 0
Регистрация: 25.05.2015
Сообщений: 9
05.06.2015, 11:40  [ТС]
alex925, спасибо большое, научился у вас большему, чем за семестр у преподов по программированию
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
05.06.2015, 11:45
EvoLwe, Рад, что смог помочь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.06.2015, 11:45
Помогаю со студенческими работами здесь

Применение фильтров к изображению
Ребят, подскажите пожалуйста, проблема в фильтров. Задача создать 2 списка с фильтрами альфа,хрей,флипы и тд.Не динам. фильтры.Выбрать по...

Применение статических фильтров
Заранее прошу прощения, если подобная тема ранее создавалась. Вообщем нужно сделать скрипт, в котором 1. Выводится картинка 2. Под...

Применение фильтров формы из VBA.
Добрый день. Пытаюсь разобраться с применением фильтров (через свойства подчиненной формы все работает прекрасно, но мне в перспективе надо...

Применение несколько фильтров оновременно
Вопрос наверное часто задаётся, я поискал но как то не нашёл ответа. Помогите написать код или подскажите в какой теме посмотреть....

Применение двух и больше фильтров сразу
Народ, возможно ли применение сразу нескольких фильтров ? К примеру, по году и месяцу? Выходит только по одному из параметров.. подскажите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru