Разделить изображение на произвольное количество блоков - PullRequest
1 голос
/ 05 июля 2019

Мне нужно разделить изображение RGBA на произвольное количество блоков, которые имеют одинаковый размер, насколько это возможно

Я пытался использовать numpy.array_split, но не уверен, как это сделать при сохранении RGBA.каналы

Я посмотрел следующие вопросы, ни один из которых не описывает, как разделить изображение на n блоков, они ссылаются на разделение изображения на блоки с заданным размером пикселя или как разделить изображение на какую-то форму.

Хотя кажется, что вычислить количество блоков по размеру и размеру изображения было бы не просто, я не уверен, как это сделать.

Как разделить изображение наНесколько кусков в Python

Разрезание одного изображения на несколько изображений с помощью библиотеки изображений Python

Разделение изображения на информацию о прямоугольниках в Python

При попытке определить количество ящиков по размеру пиксельного ящика я использовал формулу

num_boxes = (img_size[0]*img_size[1])/ (box_size_x * box_size_y)

, но это не привело кразделение должным образом

Чтобы уточнить, я хотел бы иметь возможность ввести изображение, представляющее собой массив значений размера (a, b, 4) и несколько блоков, и вывести изображения в некоторой форме (np array предпочтительнее, но что бы ни работало)

Я ценю любую помощь, даже если вы не можете предоставить полный метод, я был бы признателен за некоторые указания.

Я пробовал

def split_image(image, n_boxes):
    return numpy.array_split(image,n_boxes)
    #doesn't work with colors

def split_image(image, n_boxes):
    box_size = factor_int(n_boxes)
    M = im.shape[0]//box_size[0]
    N = im.shape[1]//box_size[1]

    return [im[x:x+M,y:y+N] for x in range(0,im.shape[0],M) for y in range(0,im.shape[1],N)]

factor_int возвращает целое число как можно ближе к квадрату из Коэффициент целое число к чему-то как можно ближе к квадрату

1 Ответ

0 голосов
/ 10 июля 2019

Я до сих пор не уверен, что ваши входные данные - это изображение и размеры ящиков или изображение и количество ящиков. Также я не уверен, что ваша проблема - решить, где нарезать изображение или знать, как нарезать 4-канальное изображение, но, возможно, что-то здесь поможет вам начать.

Я начал с этого изображения RGBA - круги прозрачные, а не белые:

enter image description here

#!/usr/bin/env python3

from PIL import Image
import numpy as np
import math

# Open image and get dimensions
im = Image.open('start.png').convert('RGBA') 

# Make Numpy array from image and get height and width
ni = np.array(im)
h ,w = ni.shape[:2]
print(f'Height: {h}, width: {w}')

BOXES = 4
for i in range(BOXES):
    this = ni[:, i*w//BOXES:(i+1)*w//BOXES, :]
    Image.fromarray(this).save(f'box-{i}.png') 

Вы можете изменить BOXES, но если оставить значение 4, вы получите следующие 4 изображения:

enter image description here [enter image description here] [enter image description here] 4 enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...