画像処理が注目されているけど、プログラムで画像を扱うには何から始めればいいんだろう?
みんながつまずくと所をうまく避けながら軽く初めてみたいな。
こういった要望に応えていきます。
画像処理ライブラリOpenCVの基本的な使い方
画像処理ライブラリはOpenCVを利用します。
OpenCVは画像処理における定番のオープソースで、基本的な機能はもちろん、実践的な処理も多数実装されており、実務でも頻繁に利用されます。画像処理を体感してみたい方も、入門したい方もOpenCVを選んでおけばまず間違いないと思います。
それでは具体的に次のステップに従ってOpenCVの使い方をみていきます。
- 画像の読み込み
- 画像のグレースケール化
- 画像サイズの変更
- 画像の保存
画像の読み込み: cv2.imread
画像の読み込みにはcv2.imreadを用います。
- 画像の読み込み方法
import cv2 # OpenCV
img_path = './note_tech_logo.png' # 読み込む画像のPath
img_clr = cv2.imread(img_path) # 画像の読み込み
グレー画像として読み込みたい場合は、第2引数にcv2.IMREAD_GRAYSCALEを指定して、cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)とすれば大丈夫です。
デフォルトではカラー画像として読み込まれます。
グレースケール化: cv2.cvtColor
OpenCVでは色空間を変換する方法としてcv2.cvtColorが用意されています。これを用いることでカラー画像からグレー画像への変換が可能です。
- グレースケール化の方法
img_gry = cv2.cvtColor(img_clr, cv2.COLOR_BGR2GRAY)
### cvtColor(変換元画像, 色変換の種類)
色変換の種類を変えることでBGR形式からRGB形式に変換することも可能です。この必要性については後述します。
画像サイズの変更: cv2.resize
読み込んだ画像のサイズを変更にはcv2.resizeを用います。
- 画像サイズを変更する方法
size = (img_gry.shape[0]//2, img_gry.shape[1]//2) # 変換後の画像サイズを準備
img_resize = cv2.resize(img_gry, size)
### cv2.resize(変換元画像, 変換後のサイズ)
cv2.resizeを使う場合の注意点として、"変換後のサイズ"はリスト[]ではダメで、タプル()で指定する必要があります。またfloatのような小数点を許容した型もNGなのでint型で指定しましょう。
画像の保存: cv2.imwrite
画像の保存にはimwriteを用います。
形式は、cv2.imwrite("保存先", 保存する画像)です。
- 画像の保存方法
img_clr = cv2.imwrite("./gry_image.png", img_gry)
# cv2.imwrite("保存先", 保存する画像)
"保存先"で指定した拡張子を元に、保存形式は自動で処理されます。また、カラー画像、グレースケール画像の指定も不要です。
よくある詰まり所と対処方法
OpenCVを用いた画像処理について、基本的な所をいくつか紹介してきました。ただ、ここまでの範囲でもいくつか躓きどころがあるので、筆者の実体験も合わせて紹介していきます。
cv2.imreadで画像が読み込まれない
cv2.imreadで存在しないpathを指定してもエラーとはならず、Noneが返ってきます。そのためプログラムとしては動作し続けますが、いざ画像を表示するといった処理を行おうとするとエラーになります。
import cv2
non_img_path = "./not_image" # 存在しないファイルのPath
non_img = cv2.imread(non_img_path)
print(non_img) # None
このコードはエラーせずに通りますが、cv2.imreadの返り値はNoneになっています。
大抵は指定した画像のPathが誤っているので確認しましょう。
グレースケール画像を表示する際のカラーマップ: cmap
グレースケール化したmatplotlibなどを用いて表示しようとすると、グレーにならずに色のついた画像が表示されることがあります。
これはグレースケールのカラーマップがグレーになっていないためです。これを解決する方法はシンプルで、画像表示する際に、cmap='Greys'と指定すればOKです。
# グレースケール画像を表示してみます
fig, ax = plt.subplots()
ax.imshow(img_gry)
# cmap='Greys'を指定する場合
fig, ax = plt.subplots()
ax.imshow(img_gry, cmap='Greys')
matplotlibとOpenCVとのカラーコードの違い
OpenCVとmatplotlibではカラーの順番が異なっています。具体的にはOpenCVではBGR(青、緑、赤)の順番なのですが、matplotlibではRGB(赤、緑、青)の順番になります。これはどういう影響が出るのかを具体例を紹介します。
OpenCVで読み込んだカラー画像をそのまま、matplotlibで表示させます。
img_path = './note_tech_logo.png' # 読み込む画像のPath
img_clr = cv2.imread(img_path) # 画像の読み込み
# BGRとして表示
fig, ax = plt.subplots()
ax.imshow(img_clr)
これを回避する方法は簡単で、グレースケール化で使用したcv2.cvtcolorを使って、色の順番をRGBにすれば解決します。
img_clr = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB) # カラーの順番をBGRからRGBへ変換
fig, ax = plt.subplots()
ax.imshow(img_clr)
コメント