Wil*_*sem 76
是的,你可以安装opencv(这是一个用于图像处理和计算机视觉的库),并使用该cv2.resize功能.例如使用:
import cv2
import numpy as np
img = cv2.imread('your_image.jpg')
res = cv2.resize(img, dsize=(54, 140), interpolation=cv2.INTER_CUBIC)Run Code Online (Sandbox Code Playgroud)
img因此,这是包含原始图像res的numpy数组,而是包含调整大小的图像的numpy数组.一个重要的方面是interpolation参数:有几种方法可以调整图像大小.特别是因为你缩小图像,而原图像的大小是不是调整后的图像的大小的倍数.可能的插值模式是:
INTER_NEAREST- 最近邻插值INTER_LINEAR- 双线性插值(默认使用)INTER_AREA- 使用像素区域关系重新采样.它可能是图像抽取的首选方法,因为它可以提供无莫尔条纹的结果.但是当图像被缩放时,它与INTER_NEAREST方法类似 .INTER_CUBIC- 在4x4像素邻域上的双三次插值INTER_LANCZOS4- 在8x8像素邻域上的Lanczos插值
与大多数选项一样,没有"最佳"选项,因为对于每个调整大小架构,有一种策略可以优先于另一种策略.
jak*_*vdp 44
虽然可以单独使用numpy来执行此操作,但操作不是内置的.也就是说,你可以使用scikit-image(建立在numpy上)来进行这种图像处理.
Scikit-Image重新缩放文档就在这里.
例如,您可以对图像执行以下操作:
from skimage.transform import resize
bottle_resized = resize(bottle, (140, 54))
Run Code Online (Sandbox Code Playgroud)
这将为您处理内插,消除锯齿等问题.
Rom*_*ell 16
如果有人来这里寻找一种在 Python 中缩放/调整图像大小的简单方法,而不使用其他库,这里有一个非常简单的图像调整大小函数:
#simple image scaling to (nR x nC) size
def scale(im, nR, nC):
nR0 = len(im) # source number of rows
nC0 = len(im[0]) # source number of columns
return [[ im[int(nR0 * r / nR)][int(nC0 * c / nC)]
for c in range(nC)] for r in range(nR)]
Run Code Online (Sandbox Code Playgroud)
用法示例:将 (30 x 30) 图像调整为 (100 x 200):
import matplotlib.pyplot as plt
def sqr(x):
return x*x
def f(r, c, nR, nC):
return 1.0 if sqr(c - nC/2) + sqr(r - nR/2) < sqr(nC/4) else 0.0
# a red circle on a canvas of size (nR x nC)
def circ(nR, nC):
return [[ [f(r, c, nR, nC), 0, 0]
for c in range(nC)] for r in range(nR)]
plt.imshow(scale(circ(30, 30), 100, 200))
Run Code Online (Sandbox Code Playgroud)
这适用于缩小/缩放图像,并且适用于 numpy 数组。
mat*_*lso 10
用于下采样的单行 numpy 解决方案(乘以 2):
smaller_img = bigger_img[::2, ::2]
Run Code Online (Sandbox Code Playgroud)
和上采样(2):
bigger_img = smaller_img.repeat(2, axis=0).repeat(2, axis=1)
Run Code Online (Sandbox Code Playgroud)
(这假设 HxWxC 形状的图像。h/t 到 L.Kärkkäinen 在上面的评论中。注意这种方法只允许整个整数调整大小(例如,2x 但不是 1.5x))
对于来自Google来这里的人们,他们正在寻找一种快速降序对numpy数组图像进行下采样以供机器学习应用程序使用的方法,这是一种超快速方法(从此处改编)。仅当输入尺寸为输出尺寸的倍数时,此方法才有效。
以下示例将采样率从128x128降采样为64x64(可以轻松更改)。
频道最后订购
# large image is shape (128, 128, 3)
# small image is shape (64, 64, 3)
input_size = 128
output_size = 64
bin_size = input_size // output_size
small_image = large_image.reshape((output_size, bin_size,
output_size, bin_size, 3)).max(3).max(1)
Run Code Online (Sandbox Code Playgroud)
渠道第一订购
# large image is shape (3, 128, 128)
# small image is shape (3, 64, 64)
input_size = 128
output_size = 64
bin_size = input_size // output_size
small_image = large_image.reshape((3, output_size, bin_size,
output_size, bin_size)).max(4).max(2)
Run Code Online (Sandbox Code Playgroud)
对于灰度图像,只需将更3改为1如下所示:
渠道第一订购
# large image is shape (1, 128, 128)
# small image is shape (1, 64, 64)
input_size = 128
output_size = 64
bin_size = input_size // output_size
small_image = large_image.reshape((1, output_size, bin_size,
output_size, bin_size)).max(4).max(2)
Run Code Online (Sandbox Code Playgroud)
此方法使用的是最大池化。我发现这是最快的方法。
小智 6
对于想要调整(插值)一批 numpy 数组大小的人,pytorch 提供了一个更快的函数名称torch.nn.function.interpolate,只需记住首先使用 np.transpose 将通道从batchxWxHx3更改为batchx3xWxH。