我有4D ndarray的图像数据,其组织为[NumberOfImages, RowsOfImage , ColumnsOfImage ,ChannelsOfImage]。
现在我想将4D nararray中的图像调整为新大小,其大小为[NumberOfImages, NewRowsOfImage , NewColumnsOfImage ,ChannelsOfImage],而其他方面保持不变。
我知道在TensorFlow中有一个函数 tf.image.resize_images 来执行此操作。如果新图像大于原始图像,则使用双线性插值或最近邻插值将新图像填充新像素。
然而,在调整大小后,图像数据的ndarray被转换为TensorFlow的Tensor对象。然后我必须将它转换回ndarray。这些程序将花费大量时间。
我尝试了 skimage.transform.resize ,但此功能似乎调整了2D图像数据的大小。如果我使用此功能,我必须使用 for loop ,这将耗费大量时间。
Python中是否有resize函数与TensorFlow的tf.image.resize_images函数相同?如果没有,有人可以给我一些建议来解决我的问题吗?
非常感谢。
答案 0 :(得分:1)
使用numpy.resize
。见下面的例子。所有图像都具有相同的形状(在这种情况下为768 x 1024 x 3)。在此示例中,我使用列号切换行号。 im_all
是你的4d阵列。
from scipy.misc import imread
import numpy as np
import matplotlib.pyplot as plt
f = r"C:\Users\Public\Pictures\Sample Pictures\Lighthouse.jpg"
im0 = imread(f)
f = r"C:\Users\Public\Pictures\Sample Pictures\koala.jpg"
im1 = imread(f)
f = r"C:\Users\Public\Pictures\Sample Pictures\tulips.jpg"
im2 = imread(f)
f = r"C:\Users\Public\Pictures\Sample Pictures\desert.jpg"
im3 = imread(f)
im_all = np.array([im0, im1, im2, im3])
im_all_b = np.resize(im_all, [im_all.shape[0], im_all.shape[2], im_all.shape[1], im_all.shape[3]])
plt.figure()
plt.imshow(im_all_b[1])
plt.figure()
plt.imshow(im_all[1])
plt.show()
以下是内插使用优化的插值示例(默认为bilinear
,请参阅:http://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.misc.imresize.html):
from scipy.misc import imread, imresize
import numpy as np
import matplotlib.pyplot as plt
f = r"C:\Users\Public\Pictures\Sample Pictures\Lighthouse.jpg"
im0 = imread(f)
f = r"C:\Users\Public\Pictures\Sample Pictures\koala.jpg"
im1 = imread(f)
f = r"C:\Users\Public\Pictures\Sample Pictures\tulips.jpg"
im2 = imread(f)
f = r"C:\Users\Public\Pictures\Sample Pictures\desert.jpg"
im3 = imread(f)
im_all = np.array([im0, im1, im2, im3])
for i in range(im_all.shape[0]):
temp = im_all[0, :, :, :].copy()
im_all = np.delete(im_all, 0, 0)
temp = imresize(temp, (temp.shape[0]+200, temp.shape[1]+200, 3))
temp = np.expand_dims(temp, axis=0)
try:
im_all_b = np.vstack([im_all_b, temp])
except NameError:
im_all_b = temp
plt.figure()
plt.imshow(im_all_b[1])
plt.show()
在上面的示例中,我为x轴和y轴各添加了200个像素。