#python #image-processing
#python #обработка изображений
Вопрос:
Кто-нибудь может помочь с кодом для этого? Я хочу уменьшить размер своего изображения, используя стохастическую выборку, но не могу понять, как установить пределы моего входного патча.
# New smaller image
img_small = np.zeros((img.shape[0] // factor, img.shape[1] // factor),
dtype=np.int64)
# Loop over the rows of the smaller image
for i in range(img_small.shape[0]):
# Loop over the columns of the smaller image
for j in range(img_small.shape[1]):
# The input patch should consist of rows from factor * i to
# factor * (i 1) - 1, and columns from factor * j to
# factor * (j 1) - 1
# input_patch = img[ # Extract the input patch
# Can use np.random.choice(input_patch.flatten(), ...) to choose random
# pixels from input_patch
# img_small[i, j] = # Set the output pixel
img_small[i, j] =
Ответ №1:
Ограничения указаны в комментариях, просто примените их к массиву. Использование примера изображения
и использование вашего кода (добавлена загрузка изображения и преобразована в оттенки серого — вам нужно будет добавить обработку цвета, если требуется цвет):
from PIL import Image
import numpy as np
from matplotlib.pyplot import imshow
# load the image and convert to greyscale
image = Image.open('imglrg0.jpg').convert('LA')
# convert image to numpy array
img_lrg = np.asarray(image)
#imshow(img_lrg)
factor = 8
# New smaller image
img_small = np.zeros((img_lrg.shape[0] // factor, img_lrg.shape[1] // factor),
dtype=np.int64)
# Loop over the rows of the smaller image
for i in range(img_small.shape[0]):
# Loop over the columns of the smaller image
for j in range(img_small.shape[1]):
# The input patch should consist of rows from factor * i to
# factor * (i 1) - 1, and columns from factor * j to
# factor * (j 1) - 1
# input_patch = img[ # Extract the input patch
input_patch = img_lrg[i * factor:(i 1) * factor - 1, j * factor:(j 1) * factor - 1]
# Can use np.random.choice(input_patch.flatten(), ...) to choose random
# pixels from input_patch
# img_small[i, j] = # Set the output pixel
img_small[i, j] = np.random.choice(input_patch.flatten())
imshow(np.asarray(img_small))
что приводит к (для factor=8
. Не лучший результат, но узнаваемый. Может быть, немного поиграйте с выборкой, чтобы улучшить. Я просто использовал matplotlib для быстрого отображения результата, чтобы он не был цветным.):
Так же, как дополнение к выборке: выбор среднего значения из трех точек, подобных so img_small[i, j] = np.average(np.random.choice(input_patch.flatten(), 3))
, приводит к существенному улучшению: