Преобразование изображения в постеризованное изображение с соответствующей наложением сетки и символов.Python

Программы на Python
Ответить
Anonymous
 Преобразование изображения в постеризованное изображение с соответствующей наложением сетки и символов.

Сообщение Anonymous »

Во-первых, я хочу помочь маме с ее вышивальными проектами, а во-вторых, я хочу лучше освоить Python. Так что мне не нужно точное решение. Но было бы здорово указать правильное направление(а) или библиотеки.
Результат, которого я хочу достичь (создан вручную с помощью Photoshop):
Изображение

В основном я хочу автоматизировать следующие процессы, упакованные в небольшое окно инструментов, например tkinter:
  • Загрузить изображение
  • Уменьшите его цвета до заданной пользователем величины (квантование )
  • Пикселизация; на собственный «размер блока», также определяемый пользователем. В пиксельных единицах, например; 16x16px
  • Создать наложение сетки на основе того же «размера блока».
  • Создать уникальные «символы», соответствующие количеству цветов (анализировать значения RGB). и разместив их в сетке/сводной таблице/таблице.
Мне удалось создать графический интерфейс с помощью ttk и использовать PIL для квантования и пикселизации. Параметр пикселизации основан на процентах, которые я предпочитаю преобразовывать на основе пикселей. Я предполагаю, что это позволяет мне создавать сетку с «блоками» одинакового размера.
Я знаю, как сделать все вручную в такой программе, как Photoshop. Мне нужна помощь в понимании, как это сделать в Python. Особенно, когда размер сетки меняется.
На данный момент мои исследования (как полный новичок в Python, с некоторыми базовыми уроками) сводятся к изучению вариантов на каждом этапе. Я понял, какие расчеты мне нужны для уменьшения цветов; квантование в PIL, как пикселизировать в PIL и как извлекать значения RGB, чтобы соединить их с уникальными сгенерированными символами. Но после этого мне бы хотелось получить несколько указаний о том, как «наложить» сетку с помощью этих символов.
Опять же, я хочу научиться, поэтому не ищу точного решения.
Вот моя настройка
import tkinter as tk
from tkinter import ttk

from PIL import Image

import numpy as np
import os

# root window
root = tk.Tk()
root.geometry('300x200')
root.title('Embroidery Generator')

# Load image button (This is how I would like the tool to operate)
loadLabel= tk.Label(
root,
text='Source image',
)

loadLabel.grid(
row=0,
column=0,
sticky='w',
)

loadButton= ttk.Button(
root,
text='Load...',
)

loadButton.grid(
row=0,
column=1,
sticky='w',
)

# Max Colors Entry
maxColorsLabel= tk.Label(
root,
text='Max. colors'
)

maxColorsLabel.grid(
row=1,
column=0,
sticky='w',
)

e1= tk.Entry(
root,

)

e1.grid(
row=1,
column=1,
sticky='w',
)

# Grid size Entry
gridLabel= tk.Label(
root,
text='Grid size'
)

gridLabel.grid(
row=2,
column=0,
sticky='w',
)

e2= tk.Entry(
root,
)

e2.grid(
row=2,
column=1,
sticky='w',
)

# Quantization button to reduce max color (will become user input)
def quantize():
im = Image.open(os.path.expanduser("~/Downloads/surf.png")).convert('RGB')
im = im.quantize(4, dither=None)
im.save(os.path.expanduser("~/Downloads/surf_quantized.png"))
im.show()

quantize_button = ttk.Button(
root,
text='1.Quantize',
command=quantize
)

quantize_button.grid(
row=4,
column=0,
sticky='w',
)

# Pixelate button (will also become user input)
def pixelate():
im = Image.open(os.path.expanduser("~/Downloads/surf_quantized.png"))
#find its width & height
w,h = im.size
#find NEW dimensions from user-defined number (in percentages now. Want to transform this in 'blocks' based on pixels)
new_w = w * 0.05
new_h = h * 0.05
#round to nearest whole number and convert from float to int
new_w = np.round(new_w)
new_w = int(new_w)
new_h = np.round(new_h)
new_h = int(new_h)
#downsample image to these new dimensions
down_sampled = im.resize((new_w, new_h))
#upsample back to original size (using "4" to signify bicubic)
up_sampled = down_sampled.resize((w, h), resample = 4)
#save the image
up_sampled.save(os.path.expanduser("~/Downloads/surf_pixalated.png"))
up_sampled.show()

pixelate_button = ttk.Button(
root,
text='2.Pixelate!',
command=pixelate
)

pixelate_button.grid(
row=5,
column=0,
sticky='w',
)

# exit button
exit= ttk.Button(
root,
text="Exit",
command=lambda: root.quit()
)

exit.grid(
row=6,
column=0,
sticky='w',
)

root.mainloop()


Подробнее здесь: https://stackoverflow.com/questions/791 ... lay-and-sy
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»