Я хочу преобразовать значения пикселей изображения в градациях серого в векторные точки, чтобы значение пикселя в градациях серого определяло радиус соответствующей точки. Но я застрял полностью, проект должен быть закончен в воскресенье, и я действительно отчаялся в данный момент
Справочная информация: Для моего университетского курса "введение в python" я хочу сделать конструкцию бесстыдная копия "растербатора" (https://rasterbator.net/) с python (но в гораздо более примитивном ключе).
Как я хочу подойти к этому? : Я загружаю изображение с помощью PIL, делаю его в градациях серого и преобразую его в массив numpy. Затем я разрезаю массив на множество маленьких квадратных массивов (по одному сегменту на каждую намеченную точку), вычисляю средние значения для каждого массива и собираю его обратно в один массив, который теперь намного меньше исходного. До этого момента я мог это сделать (но это заняло у меня много времени). Теперь я хочу «заменить» пиксели точками и создать несколько PDF-файлов, чтобы вы могли распечатать их, склеить вместе и получить большой плакат.
Может ли этот подход работать? Или я лаю не на том дереве?
Я кровавый python новичок. Проблема с python для меня в том, что есть так много модулей, о которых я не знаю. Вероятно, ответ действительно прост, но я просто не знаю, где искать. Буду очень признателен, если кто-нибудь скажет мне, если я иду в правильном направлении или направлю меня в правильном направлении.
Заранее большое спасибо
Вот код того, что мне удалось до сих пор (это не так много)
from PIL import Image as img
import numpy as np
greyscale = np.asarray(img.open("test.jpg").convert("L")) #load picture into array and make it greyscale
end_width = 1500 # chosen width of final picture in mm (will be with kwargs later on)
dot_size = 13 #chosen dot-size of final pictutre in mm (will be with kwargs later on)
estimate_dot_count_x = int(np.ceil(end_width/dot_size)) # estimates the "horizontal resolution"
pixel_in_segment = int(np.ceil(greyscale.shape[1]/estimate_dot_count_x)) #calculates the edge length of a segment
W=pixel_in_segment #just for shorter formular later on
estimate_dot_count_y = int(np.ceil(greyscale.shape[0]/pixel_in_segment)) # estimates the "vertical resolution"
final_dot_count_x=int(np.ceil(greyscale.shape[1]/W)) #final horizontal resolution for shape of new array
final_dot_count_y=int(np.ceil(greyscale.shape[0]/W)) #final vertical resolution for shape of new array
#slice array into multiple pieces
tiles = [greyscale[x:x+W,y:y+W] for x in range(0,greyscale.shape[0],W) for y in range(0,greyscale.shape[1],W)]
#calculate mean values of each segment an safe it to list
average_list = []
for pixel in tiles:
result=int(np.mean(pixel))
average_list.append(result)
#convert list back into an array
downscale=np.asarray(average_list, dtype=int).reshape(final_dot_count_y,final_dot_count_x)
РЕДАКТИРОВАТЬ: каким-то образом мне удалось нарисовать массив в векторные точки:
#inverse and normalize gray value so That I can multiply with max dot size
for ix,iy in np.ndindex(downscale.shape):
downscale[ix,iy]= float(1-downscale[ix,iy]*(1/255))
reportlab был ключом Я искал ...
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
#making dots
def printing(c):
c.translate(spacing*0.5,imh-(spacing*0.5))
for ix,iy in np.ndindex(downscale.shape):
c.circle(iy*(spacing), ix*(-spacing), downscale[ix, iy]*max_dot_size, stroke=1, fill=1)
c = canvas.Canvas("hello.pdf", pagesize=(imwidth, imhight))
printing(c)
c.showPage()
c.save()
В связи с этим возникает вопрос: как мне сообщить reportlab, что я хочу напечатать этот большой холст (размером 2 x 1,5 м) на нескольких страницах в общий формат принтера («письмо» или «A4»)?