Pythonによる画像処理の始め方: OpenCV編

pythonによる画像処理の始め方 OpenCV

画像処理が注目されているけど、プログラムで画像を扱うには何から始めればいいんだろう?
みんながつまずくと所をうまく避けながら軽く初めてみたいな。

こういった要望に応えていきます。

本記事で学べる内容
  • 画像処理ライブラリOpenCVの基本的な使い方
  • よくある詰まり所解決方法

画像処理ライブラリ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)

コメント

タイトルとURLをコピーしました