データ分析実践
初級問題チェック

問題 34 /40

画像の加工に関して、誤った説明はどれか。

選択 1

Pillowのthumbnailメソッドで画像を縮小すると、縦横比は維持しない。

選択 2

OpenCVで画像を縮小する場合は、resize関数を使う。

選択 3

Pillowで画像を切り取る場合は、cropメソッドを使う。

選択 4

Pillowで画像をグレースケール化する場合は、convertメソッドを使う。

解説

選択肢1が正解です。 次の画像で解説します。 sample.png ▶︎
*横800ピクセル、縦533ピクセル 【選択肢1】 Pillowのthumbnailメソッドで画像を縮小すると、縦横比は維持しない。 誤った説明です。 thumbnailメソッドは、元の画像の縦横比を維持します。 from PIL import Image img = Image.open('sample.png') img.size ▶︎ (800, 533) img.thumbnail((256, 256)) ▶︎ img.size ▶︎ (256, 171) 引数の「256, 256」は、「横を256ピクセル以内、縦を256ピクセル以内に縮小する」という意味で、横と縦の大きいほうが256ピクセルになり、小さいほうのサイズは自動調整されます。この画像の場合、横のサイズのほうが大きいため横が256ピクセルになり、それに合わせて縦が171ピクセルに自動調整されます。 Pillowには画像を拡大・縮小するresizeメソッドがありますが、こちらは縦横比を維持せず、指定したサイズ通りに変更します。 img = Image.open('sample.png') img_resize = img.resize((256, 256)) img_resize ▶︎ img_resize.size ▶︎ (256, 256) 縦横比が維持されず、左右が圧縮されています。 【選択肢2】 OpenCVで画像を縮小する場合は、resize関数を使う。 正しい説明です。 import cv2 as cv from PIL import Image img = cv.imread("sample.png") img_resize = cv.resize(img,(256, 256)) Image.fromarray(img_resize) ▶︎ OpenCVの戻り値はNumpyのndarrayになります。変数imgも変数img_resizeも、中身はndarrayです。ndarrayを画像として表示するために、Pillowのfromarray関数を最終行で使っています。 OpenCVのresize関数は、Pillowのresizeメソッドと同様に縦横比を維持せず、指定したサイズ通りに変更します。 また、OpenCVの色の順番はBGRですが、PillowはRGBです。ここでは、OpenCVで読み込んだBGRの画像を、PillowのRGBで出力していため、色が変わっています。次のようにBGRをRGBに変換すれば、正しい色で出力されます。 Image.fromarray(cv.cvtColor(img_resize, code=cv.COLOR_RGB2BGR)) なお、PillowのresizeメソッドもOpenCVのresize関数も、縮小だけではなく拡大もできます。拡大時の画像の補間方法も指定することができます。 【選択肢3】 Pillowで画像を切り取る場合は、cropメソッドを使う。 正しい説明です。 img_crop = img.crop((360, 60, 600, 400)) img_crop ▶︎ 切り出す領域の引数は「left, upper, right, lower」の順で指定します。
左上の座標を「left, upper」で指定し、右下の座標を「right, lower」で指定します。 【選択肢4】 Pillowで画像をグレースケール化する場合は、convertメソッドを使う。 正しい説明です。 img.convert('L') ▶︎
引数を「L」とすることで、8ビットのモノクロ画像に変換します。 (公式書籍 p.244-247、255)