【画像処理100本ノック】チュートリアルをやってみた【Google Colaboratory】

少し前から100本ノック系の話が界隈で盛り上がっていたので(今更感満載ですが)やってみようかと思っていたところこちらの記事を発見。
Python関係の「○○100本ノック」のまとめ

とりあえず仕事で画像処理をやろうと思っていたので画像処理100本ノックからやってみようと思いました。
今後、頭の整理がてら内容を投稿していこうと思います。
というわけで今回はチュートリアルのみ。

※あくまで個人の備忘録的な内容のため、内容を知りたい方は本家を見るのが丁寧かつわかりやすいです。
画像処理100本ノック – チュートリアル

また基本的にはGoogle Colabで進めており、チュートリアルにも記載がありますが、画像の表示周りで以下の記事に大変助けられました。
画像処理100本ノックを「Google Colaboratory」で楽々学習

この場を借りてお礼申し上げます。

早速チュートリアルをやってみる

チュートリアルは基本的に以下の手順で進んでいきます。

  • 必要なライブラリのインポート
  • 画像の読み込みと表示
  • 画素の変更
  • 画像のコピー
  • 画像の保存
  • 画素値の反転

この記事内でも上記手順で進めていきます。

必要なライブラリのインポート

実際のチュートリアル内ではライブラリのインポートからですが今回はGoogle Colaboratoryを使うのでまず必要な画像のダウンロードからしていきます。

# 画像のダウンロード
!wget https://raw.githubusercontent.com/yoyoyo-yo/Gasyori100knock/master/Tutorial/imori.jp

画像がダウンロードできたら次は必要なライブラリのインポートをしていきます。

import cv2
import matplotlib.pyplot as plt

これで一旦チュートリアルを進めるのに必要な画像のダウンロードとライブラリのインポートは終了です。

画像の読み込みと表示

次はダウンロードした画像の読み込みと表示を行っていきます。
Google Colaboratoryを使う場合は、この画像の表示がチュートリアル通りだと動かないので気をつけてください。

とはいうものの正直私もなぜチュートリアル通りだと動かないのか、書き換えたコードだとなぜ表示されるのか、というところについてはあまり理解できていません…。
このあたりは整理して備忘録のブログを書こうと思います。

コードを見ている感じだと、おそらくチュートリアル通りにやると新しくウィンドウがポップアップして画像が表示されるんじゃないかと思っています。
Google ColaboratoryはUbuntuなので新規でウィンドウが立ち上がったりすることはありません。
そのため、コードの書き換えられが必要なんだと思います。

img = cv2.imread('imori.jpg')
print('shape is {}'.format(img.shape))
print('dtype is {}'.format(img.dtype))
 上記を実行すると以下のような表示がされるはずです

shape is (128, 128, 3)
dtype is uint8

shpaeにある128というのは縦が128ピクセル横が128ピクセルということです。
最後の3という数字は色の情報で青、緑、赤の3チャネルだということを表しています。

dtypeでは画像の型を取得することができます。
上にあるuint8というのは符号なしのint型で8bitということを意味しています。
画像にする際には必ずこの型にしないと画像がおかしくなってしまうそうなので気を付けなければいけません。

画像を表示する際にはpltのimshowを使います。

plt.axis('off')
plt.imshow(cv2.cvtColor(_img, cv2.COLOR_BGR2RGB))

axisをoffにすることで目盛りを消すことができますが好みなのでどちらでも良いと思います。

画像をいじる際のおすすめの手順

画像をいじる際には以下の手順に則っていじるのが良いそうです。

  • 画像を読み込む
  • 型を一度小数点型に変換する
  • 画像をいじる
  • 画素が0未満のものは0、255を超えたものについては255に直す
  • 小数点型に変換した型をuint8に変換して表示・保存する。

良いそうです、と言いながらも小数点型に変換する必要性が今のところあまり分かっていません…。
この辺りは理解した時点で追記していきたいと思います。

画素の変更

では実際に読み込んだ画像の画素値を確認してみたいと思います。
今回はx=50、y=80の画素値を見てみたいと思います。

img[50, 80]

以下のように表示されたはずです。

array([196, 171, 197], dtype=uint8)

表示されるのは色の情報でBGRの順番で並んでいます。
ではこの画素値の青色の値を取ってみましょう。
青色なのでインデックス番号0を指定してあげることで取得することができます。

img[50, 80, 0]

196という数値が取得できたかと思います。
ここまではウォーミングアップ的な内容なので次は実際に画素値を変更してみましょう。

次のコードで画像の左上1/4を黒く塗りつぶしてみます。

img2 = img.copy()
img2[:64, :64] = 0

画像は縦横ともに128ピクセルですので64と指定することによって画像の左上1/4を黒く塗りつぶすことができます。

画像のコピー

画像のコピーにはcopy()を使いましょう。
これは特に画像に限って話ではないので大丈夫でしょう。

img2 = img.copy()

画像の保存

画像の保存はimwriteを使います。
第1引数に保存するファイル名、第2引数に保存する画像を指定すればOKです。
正常に保存ができればTrueと表示されるはずです。

cv2.imwrite('sample.jpg', img2)

画素値の反転

最後に読み込んだ画像の緑と赤の画素値を反転させて終わります。

img3 = img.copy()
H, W, C = img3.shape
img3[:H//2, :W//2] = img3[:H//2, :W//2, (2, 1, 0)]
plt.imshow(cv2.cvtColor(img3.astype(np.uint8), cv2.COLOR_BGR2RGB))

これで左上1/4が緑色と赤色が反転した画像が出てきたはずです。
元々緑青赤(0,1,2)の順番で並んでいるので緑と赤を入れ替える(2,1,0)と色が反転するということですね。

今回のチュートリアルの内容については以上になります。
次回からは一本ずつ記事にしていく予定ですのでよろしくお願いします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

16 + 16 =