2016-07-06 5 views
1

私は[NumberOfImages、RowsOfImageColumnsOfImage、ChannelsOfImage]のように整理された4Dのndarrayの画像データを持っています。PythonでTensorFlowのtf.image.resize_images関数として画像のサイズを変更するresize関数はありますか?

今、私は他の寸法は変わらないまま、[NumberOfImages、NewRowsOfImageNewColumnsOfImage、ChannelsOfImage]の大きさである新しいサイズに4Dのndarrayで画像のサイズを変更したいです。

これを行うには、TensorFlowにtf.image.resize_imagesの機能があります。新しいイメージが元のイメージより大きい場合、新しいイメージは、Bilinear補間またはNearest neighbor interpolationを使用して新しいピクセルで塗りつぶされます。

しかし、画像データのn配列は、サイズ変更後にTensorFlowのTensorオブジェクトに変換されました。それから私はそれをndarrayに戻さなければなりません。これらの手順は膨大な時間を要する。

私は試しましたskimage.transform.resizeしかし、この機能は、2D画像データのサイズを変更するようです。この機能を使用する場合は、ループにはを使用する必要があります。これには膨大な時間がかかります。

Pythonには、TensorFlowのtf.image.resize_images関数と同じサイズ変更関数がありますか?そうでない場合は、誰かが私の問題を解決するためにいくつかの助言を与えることができますか?

ありがとうございました。

答えて

1

numpy.resizeを使用してください。下記の例を参照してください。すべての画像は同じ形状(この場合は768 x 1024 x 3)です。この例では、列番号で行番号を切り替えました。 im_allは4d配列です。 Iはxおよびy軸のそれぞれに200個のピクセルを追加上記の例では

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() 

:メモリ使用量の最適化:ここ

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() 

は(http://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.misc.imresize.htmlデフォルトbilinearで、参照)補間との一例です。

+0

ありがとうございます。しかし、あなたの例の操作はイメージの形を変えるだけです。それで、np.resize関数はイメージをより大きなイメージにリサイズすることができるようですが、TensorFlowの関数tf.image.resize_imagesのような最近隣の補間メソッドのような一般的な補間方法を使ってリサイズしません。元のイメージに繰り返しコピーされます。申し訳ありませんが、これは私が望むものではありません。とにかく、同じことに感謝します。 – Kongsea

+0

私の編集した答えを見てください。 –

+0

はい、今回は動作します。しかし、あなたのプログラムでは、** forループ**を使用しました。これは、画像データに何十万もの画像が含まれているため、膨大な時間を要しました。また、0から1の範囲の浮動小数点形式に画像データを再スケーリングすると、フォーマットがサポートされていないことを示すエラーが発生します。とにかく、親切なお手伝いをしてくれてありがとう。 – Kongsea

関連する問題