python - 将图像拆分为任意数量的框
问题描述
我需要将 RGBA 图像拆分为任意数量的尽可能大小相同的框
我曾尝试使用 numpy.array_split,但不确定如何在保留 RGBA 通道的同时这样做
我看过以下问题,没有一个详细说明如何将图像拆分为 n 个框,它们引用了将图像拆分为预定像素大小的框,或者如何将图像拆分为某种形状。
虽然从盒子大小和图像大小中获取盒子数量似乎是一些简单的数学运算,但我不确定如何做到这一点。
在尝试从像素框大小确定框数时,我使用了公式
num_boxes = (img_size[0]*img_size[1])/ (box_size_x * box_size_y)
但这并没有导致图像被正确分割
澄清一下,我希望能够输入一个大小为 (a,b,4) 的 numpy 数组和多个框的图像,并以某种形式输出图像(首选 np 数组,但不管怎样都行)
我很感激任何帮助,即使你不能提供完整的方法,我也会很感激一些方向。
我努力了
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 返回尽可能接近正方形的整数,将整数分解为尽可能接近正方形的值
解决方案
我仍然不确定您的输入实际上是图像和框的尺寸还是图像和框的数量。我也不确定您的问题是决定在哪里剪切图像或知道如何剪切 4 通道图像,但也许这里的一些东西会让您开始。
我从这张 RGBA 图像开始 - 圆圈是透明的,而不是白色的:
#!/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 个输出图像:
[ ] [ ] 4
推荐阅读
- python - 在 Pandas 中将行值分组为列
- r - 如何测量许多功能的 system.time
- django - 模板中未显示模型实例的更改
- angular - 如何使用 Selenium 在 Angular 7 应用程序中提取工具提示文本
- c# - 识别下一个更高数字的算法,该数字可以除以 10 的幂
- java - CSV 中的 BeanIO unquotedQuotesAllowed 不起作用
- tcp - lwIP:如何在需要连续断开连接过程的应用程序中避免“内存错误(ERR_MEM)”?
- sql - 使用正则表达式在列中查找和追加
- python - 我无法理解这个 Yield 表达式的输出
- node.js - 为什么 findAll() 不返回模型中的所有对象?