今回は画像処理について学びます。
ゼルダの冒険のキャラクター「リンク」君の画像ですが、プロパティは以下の様になっています
ここで着目してほしいのが、幅と高さです。リンク君の画像の場合、幅:266ピクセル 高さ:242ピクセルとなっています。 ピクセルとはいったいどのようなものでしょうか?
ピクセルには光の三原則の要素、赤・緑・青が0~255まで指定されており、大きい方がより濃いということになります。
絵具をまぜる場合をイメージして欲しいのですが、紫であれば、赤+青、黄色であれば、赤+緑のような感じでカラーを 表現します。赤・緑・青を全部入れると白になります。ここは絵の具(色の三原則)とは違うところですね。画像の中身をエクセルに出力して確認してみましょう
jupyter notebookを立ち上げて以下のコードを入力して実行してみてください。また提供したOUT.xlsxをプログラムを同じフォルダに格納してください
①openpyxlをインストールします
!pip install openpyxl
②opencvで画像を読み込み、読み込んだ結果の中から、赤の要素だけを取り出し、EXCELに貼り付けます
# ワーニングがうざいので消します
import warnings
warnings.filterwarnings('ignore')
# EXCELを読み、シートを指定します
import openpyxl
BookA = openpyxl.load_workbook("OUT.xlsx")
SheetRed = BookA.get_sheet_by_name("red")
# opencvを使って画像を読みます
import cv2
import numpy as np
# 画像の読み込み(OPENCV はBGRの順)
img = cv2.imread("link.jpg")
# 変数imgはnumpyの2次元の配列なので、赤の要素(img[:,:,2])を一個づつ取り出して、EXCELのシートに貼り付けていきます
ndarrayRed = img[:,:,2]
for rowA in range(ndarrayRed.shape[0]):
for colA in range(ndarrayRed.shape[1]):
SheetRed.cell(row=rowA+1, column=colA+1, value=ndarrayRed[rowA][colA])
# EXCELをセーブします
BookA.save("OUT.xlsx")
③張り付けられたEXCELをEXCELのカラースケールという機能を使って、各セルの数値の大きさに従って色を付けて可視化します
1. OUT.xlsを開きます 2. セルを全選択します 3. ホーム > 条件付き書式 > カラースケール から赤色のスケールを選択します 4. 表示 > ズーム > 指定 10% を指定して縮小表示します【結果】
※縮小する前:要素の大きさに従って色付けされている
※縮小後
ヒント 青:配列の0番目 緑:配列の1番目(openCVはBGRの順に配列に格納されているため)
画像を表示してみます
1)matplotlibを使用した例
import cv2
from matplotlib import pyplot as plt
# 画像の読み込み
img = cv2.imread("toypu.jpg")
# opencvとmatplotlibはRGBの順番が違うので、変換(BGR->RGB)
show_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 画像表示
plt.imshow(show_img)
2)opencvを使用した例
import cv2
# 画像の読み込み
img = cv2.imread("toypu.jpg")
# 画像表示
cv2.imshow("img", img)
# 画面上でキーが押されると画面が閉じる
cv2.waitKey(0)
cv2.destroyAllWindows()
3)補足 colabでの表示
colabではimshowが動かないので、colab専用のライブラリを使用します
from google.colab.patches import cv2_imshow
# 画像の読み込み
img = cv2.imread("toypu.jpg")
# 画像表示
cv2_imshow(img)
①画像処理においては、動画は画像の複数集まったものとして処理します。パラパラ漫画のようなものですね。動画から取り出した1枚の画像をフレームといいます。
②動画を画像に出力します。動画(test.avi)をプログラムと同じフォルダに格納して、実行してください。
import cv2
#動画の読み込み
cap = cv2.VideoCapture("test.avi")
count = 0
while True:
ret, frame = cap.read()
if ret == True:
count += 1
# 画像を出力
cv2.imwrite('{:s}_{:06d}.jpg'.format("test", count), frame)
# 山ほど出力されるので、20件出力したら終了します
if count >= 20:
break
else:
break
【実行結果】
オブジェクト検出ライブラリ yolov5のサンプルプログラムを使って、物体検出の処理を体験してみます。
前提条件:環境構築手順を使用して環境が構築されていること
提供したbento.jpgをプログラムと同じフィルダに格納してください。
以下のソースをjupyter notebookに入力し、実行します。実行結果はyolov5/runs/detectフォルダ配下にできます。実行毎に作成されるフォルダは違うのでエキスプローラで確認してください
!python ../yolov5/detect.py --source bento.jpg
【処理前画像】
【処理後画像】ブロッコリーが認識されています。後ろの数字は確度です。
【演習】色々な画像を入力して、確かめてみてください。適当な画面がない場合には、以下の画像をダウンロードして使ってください
こんな画像が入っています
以下のリンクを開いて、研修を行ってください
※以下のデータをダウンロードして、各自のフォルダに格納してください