Стохастическая выборка для обработки изображений

#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)) , приводит к существенному улучшению: введите описание изображения здесь