Numpy配列ですが、画像を取得して画像のスケールを変更したいと思います。
たとえば、コカ・コーラのボトルのこの画像があります: bottle-1
これは、シェイプ(528, 203, 3)
のnumpy配列に変換され、この2番目の画像のサイズを表すためにサイズを変更します。 bottle-2
(140, 54, 3)
の形をしています。
元の画像を維持したまま、画像のサイズを特定の形状に変更するにはどうすればよいですか?他の答えは、1行おきまたは3行目を削除することを示唆していますが、私がしたいことは、基本的には、イメージエディターを使用してpythonコードでイメージを縮小することです。 numpy/SciPyでこれを行うライブラリはありますか?
ええ、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)
したがって、img
は元の画像を含むnumpy配列であり、res
はresized画像を含むnumpy配列です。重要な側面はinterpolation
パラメーターです。画像のサイズを変更する方法はいくつかあります。特に、画像を縮小し、元の画像のサイズはではなくサイズ変更された画像のサイズの倍数であるためです。可能な補間スキーマは次のとおりです。
INTER_NEAREST
-最近傍補間INTER_LINEAR
-双線形補間(デフォルトで使用)INTER_AREA
-ピクセル領域リレーションを使用したリサンプリング。モアレのない結果が得られるため、画像のデシメーションに適した方法です。ただし、画像をズームすると、INTER_NEAREST
メソッドに似ています。INTER_CUBIC
-4x4ピクセル近傍のバイキュービック補間INTER_LANCZOS4
-8x8ピクセル近傍のLanczos補間
ほとんどのオプションと同様に、サイズ変更スキーマごとに、ある戦略が別の戦略よりも優先されるシナリオがあるという意味で、「最適な」オプションはありません。
Numpyを単独で使用してこれを行うことは可能かもしれませんが、操作は組み込まれていません。そうは言っても、scikit-image
(numpy上に構築されている)を使用して、この種の画像操作を行うことができます。
Scikit-Imageの再スケーリングのドキュメントは here です。
たとえば、画像で次のことができます。
from skimage.transform import resize
bottle_resized = resize(bottle, (140, 54), anti_aliasing=True)
これにより、補間、アンチエイリアスなどの処理が行われます。
SciPyのimresize()
メソッドは別のサイズ変更メソッドでしたが、SciPy v 1.3.0以降では削除されます。 SciPyはPIL画像のサイズ変更方法を参照します:Image.resize(size, resample=0)
size– 2タプルとしての要求されたサイズ(ピクセル単位):(幅、高さ)。
resample–オプションのリサンプリングフィルター。これは、PIL.Image.NEAREST(最近傍を使用)、PIL.Image.BILINEAR(線形補間)、PIL.Image.BICUBIC(キュービックスプライン補間)、またはPIL.Image.LANCZOS(高品質ダウンサンプリングフィルター)のいずれかです。 )。省略した場合、またはイメージのモードが「1」または「P」の場合、PIL.Image.NEARESTが設定されます。
ここにリンク: https://pillow.readthedocs.io/en/3.1.x/reference/Image.html#PIL.Image.Image.resize
Googleから来て、機械学習アプリケーションで使用するnumpy
配列の画像を高速でダウンサンプリングする方法を探している人のために、超高速の方法( here から適応)を紹介します。この方法は、入力ディメンションが出力ディメンションの倍数である場合にのみ機能します。
次の例では、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)
チャンネルの最初の注文
# 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)
グレースケール画像の場合は、次のように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)
このメソッドは、最大プーリングに相当するものを使用します。私が見つけたのは、これを行う最も速い方法です。
import cv2
import numpy as np
image_read = cv2.imread('filename.jpg',0)
original_image = np.asarray(image_read)
width , height = 452,452
resize_image = np.zeros(shape=(width,height))
for W in range(width):
for H in range(height):
new_width = int( W * original_image.shape[0] / width )
new_height = int( H * original_image.shape[1] / height )
resize_image[W][H] = original_image[new_width][new_height]
print("Resized image size : " , resize_image.shape)
cv2.imshow(resize_image)
cv2.waitKey(0)