图片、numpy放大的插值方法

当新numpy/图像比原numpy/图像更大时,插值方法:
0?原数组值?线性插值?

1.numpy

形式一:
a.resize(new_shape)

#输入
import numpy as np 
# Making a random array 
gfg = np.array([1, 2, 3, 4, 5, 6]) 
# Required values 12, existing values 6 
gfg.resize(3, 4) 
  
print(gfg)

#输出:
[[1 2 3 4]
 [5 6 0 0]
 [0 0 0 0]]

形式二:
a = np.array([1,2,3,4,5,6])
numpy.resize(a, new_shape)

>>> import numpy as np
>>> ggg = np.array([1,2,3,4,5,6])
>>> fff = np.resize(ggg,(3,4))
>>> print(fff)
[[1 2 3 4]
 [5 6 1 2]
 [3 4 5 6]]

也就是,如果新数组大于原始数组,则新数组将填充a的重复副本,与a.resize(new_shape)不同,后者用零而不是重复的a填充

形式三:
a = np.array([1,2,3,4,5,6])
numpy.reshape(a,new_shape)
new_shape不能大于a.shape

2 图片

Python-OpenCV中的resize()函数

cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
其中interpolation可以接入多种插值方法,如
cv.INTER_NEAREST 最近邻插值
cv.INTER_LINEAR 双线性插值
cv.INTER_CUBIC 双线性插值
cv.INTER_AREA 使用像素区域关系重新采样。它可能是图像抽取的首选方法,因为它可以提供无莫尔条纹的结果。但是当图像被缩放时,它类似于INTER_NEAREST方法。
(通常的,缩小使用cv.INTER_AREA,放缩使用cv.INTER_CUBIC(较慢)和cv.INTER_LINEAR(较快效果也不错)。默认情况下,所有的放缩都使用cv.INTER_LINEAR。)

3. scipy.ndimage.zoom

某些场景如医学图像tiff格式,转为图像的话会有相应的耗损,介绍一种在numpy.array上的放缩操作。
scipy.ndimage.zoom(input, zoom, output=None, order=3, mode=‘constant’, cval=0.0, prefilter=True)

input,

#array—输入多维矩阵

zoom,

#float/sequence—沿轴的缩放系数,如果是浮点型,表示每个轴的缩放是相同的,如果是序列,zoom应包含每个轴的缩放值;

output=None,

#adrray or dtyoe—放置输出的数组,或返回数组的dtype,默认情况下,将创建与输入相同的dtype数据

order=3,

#int—样条插值的阶数,默认为3,顺序必须在0-5范围内;

mode=‘constant’,

#{‘reflect’, ‘constant’, ‘nearest’, ‘mirror’, ‘wrap’}—mode参数确定输入数组如何扩展到其边界之外。 默认为“constant”;

cval=0.0,

#scalar—如果模式为“constant”,则填充输入的过去边缘的值, 默认值为0.0。

perfilter=True)

#bool—确定在插值之前是否使用spline_filter对输入数组进行预过滤。 默认值为True,如果order> 1,将创建一个过滤值的临时float64数组。如果将此值设置为False,如果order> 1,输出将略微模糊,除非输入是预 过滤的,即它是调用的结果 原始输入上的spline_filter。
举例:

# input 尺寸 (512, 96, 96, 3)
# 将其转为 (512, 224, 224, 3)
# 对不同的轴进行缩放如下
import scipy

input_new = scipy.ndimage.zoom(input, (1, 224/96, 224/96, 1), output=None, order=3, mode='nearest')
input_new = zoom(cat_cubic_arr, (1, 190/250, 190/250, 1))

更详细的插值结果展示可参考:
https://blog.csdn.net/u013066730/article/details/101073505

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,对于图像的旋转和放大变换,可以使用 OpenCV 中的 `cv2.warpAffine()` 函数,该函数可以接收一个变换矩阵和一个插值方法作为参数。下面我将为您提供使用不同插值方法实现 gray 的旋转、放大变换的代码实现。 ```python import cv2 import numpy as np # 读取灰度图像 gray = cv2.imread('Image1.jpg', cv2.IMREAD_GRAYSCALE) # 图像旋转函数 def rotate_image(img, angle, interp): # 获取图像宽、高 h, w = img.shape[:2] # 计算旋转矩阵 M = cv2.getRotationMatrix2D((w/2, h/2), angle, 1) # 使用指定插值方法进行旋转变换 rotated = cv2.warpAffine(img, M, (w, h), flags=cv2.INTER_LINEAR if interp=='linear' else cv2.INTER_NEAREST) return rotated # 图像放大函数 def resize_image(img, scale, interp): # 获取图像宽、高 h, w = img.shape[:2] # 计算缩放后的图像宽、高 new_h, new_w = int(h*scale), int(w*scale) # 使用指定插值方法进行放大变换 resized = cv2.resize(img, (new_w, new_h), interpolation=cv2.INTER_LINEAR if interp=='linear' else cv2.INTER_NEAREST) return resized # 显示灰度图像 cv2.imshow('Gray', gray) # 图像旋转 rotated1 = rotate_image(gray, 45, 'linear') rotated2 = rotate_image(gray, 45, 'nearest') cv2.imshow('Rotated1', rotated1) cv2.imshow('Rotated2', rotated2) # 图像放大 resized1 = resize_image(gray, 2, 'linear') resized2 = resize_image(gray, 2, 'nearest') cv2.imshow('Resized1', resized1) cv2.imshow('Resized2', resized2) # 等待用户关闭窗口 cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的代码中,`rotate_image()` 函数用于实现图像的旋转变换,`resize_image()` 函数用于实现图像的放大变换。这两个函数都接收一个指定插值方法的参数,可以使用 `'linear'` 或 `'nearest'` 两种方法,分别对应双线性插值和最近邻插值。 运行以上代码,您将会看到使用不同插值方法实现的 gray 的旋转、放大变换的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值