データ分析実践
初級問題チェック
問題 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)






