実践型AIプログラミング特講 openCVについてチュートリアルその2 #31

実践型AIプログラミング特講 openCVについてチュートリアルその2  #31

今回は前回に引き続いて第二弾として第一弾の途中からの説明をしていきたいと考えています。今回もプログラミング上級者の方には少し物足りないかとも思いますが復習も兼ねて学習にお役立てください。第一弾を読んでいない場合は、ここをクリックして第一弾をご覧ください。ご存知のように、第一弾では、OpenCV Pythonの基礎と4つの基本的なタスクをカバーしました。では、前回の続きからスタートしていきましょう。

openCVにおける外部リンクはこちら

5.画像/ビデオフレームのサイズと形状の取得

image = cv2.imread(“victory.png”, cv2.IMREAD_COLOR)

print(image.shape) #画像の形を表示します.

print(image.size) #画像のサイズを表示します.

image = cv2.imread(“victory.png”, cv2.IMREAD_COLOR)

1行目では,cv2.imread メソッドを用いて image 変数に画像を読み込んでいます.

print(image.shape)

2行目では,image.shape を用いて,画像の高さ,幅,カラーチャンネルを取得しています.もし,画像がグレースケールフォーマットであれば,高さと幅だけが返されます.出力値は常にタプルになっています。

print(image.size)

3行目では、image.sizeを使って画像のサイズを取得しています。これは、(高さ * 幅 * カラーチャンネル)の値です。

6.画像のサイズ変更

image = cv2.imread(“victory.png”, cv2.IMREAD_COLOR)

image = cv2.resize(image, (300,300)) #リサイズ方法・関数

cv2.imshow(“IMAGE”,image)

cv2.waitKey()

cv2.destroyAllWindows()

image = cv2.imread(“victory.png”, cv2.IMREAD_COLOR)

1行目では,cv2.imread メソッドを用いて image 変数に画像を読み込んでいます.

image = cv2.resize(image, (300,300)) #リサイズメソッド/関数

2行目では,cv2.resize メソッドを利用しました.このメソッドでは,第1引数に画像の配列を渡し,希望のサイズを得るために,第2引数にサイズをタプル – (height, width) の形で渡しています.

注意:Width と Height は,整数形式でなければいけません.

cv2.imshow(“IMAGE”,image)

3行目では,cv2.imshow()メソッドを用いて,画像を表示するためのGUIウィンドウをスクリーン上に作成しました.引数では,第 1 引数に GUI ウィンドウの名前(文字列形式でなければなりません)を,第 2 引数に(画面に表示したい)画像の配列を指定しています.

cv2.waitKey()

cv2.destroyAllWindows()

4行目では,cv2.waitKey() メソッドを用いて,ユーザが閉じるボタン,キー,または指定されたキーを押すまで待つことにしました.

キーが押されたことを検出したら、コントロールを解放して、5行目(cv2.destroyAllWindows())に制御を渡し、GUI ウィンドウを閉じて破棄します

7.numpy を用いて白黒のブランク画像を作成する。

white_img = np.wones((512,512,3), dtype=np.uint8) * 255

black_img = np.zeroes((512,512,3), dtype=np.uint8)

cv2.imshow(“White Image”,white_img)

cv2.imshow(“Black Image”, black_img)

cv2.waitKey()

cv2.destroyAllWindows()

このコードを理解しましょう。

注: (0-255) の範囲は,画像の暗さと明るさを示します.”0 “は完全な黒,”255 “は白を表します.

white_img = np.wones((512,512,3), dtype=np.uint8) * 255

1行目では、numpyのメソッドの1つを使って、1だけを含む行列を作っています。np.ones()では、第1引数にタプルを渡していますが、これは空の画像行列のサイズです(タプルでは、第1項目が高さ、第2項目が幅、第3項目がカラーチャンネルです)。

第2引数には、行列のデータタイプであるnp.uint8(unsigned integer 8)を渡しています。その後、numpy broadcastingを使って行列のすべての値に255を掛け合わせ、255を含む行列を得ることができました。

ブロードキャスティングとは何かを知らない方は、以下の記事を参照してください。https://e-words.jp/w/ブロードキャスト.html

black_img = np.zeroes((512,512,3), dtype=np.uint8)

2行目では、np.zeroesメソッドを使って、ゼロだけを含む行列を作りました。np.ones()では、第1引数にタプルを渡していますが、これは空の画像行列のサイズです(タプルでは、第1項目が高さ、第2項目が幅、第3項目が色チャンネル)。第2引数には,行列のデータ型である np.uint8(unsigned integer 8)を渡しています.

cv2.imshow(“White Image”,white_img)

cv2.imshow(“Black Image”, black_img)

3行目と4行目では,cv2.imshow()メソッドを用いて,スクリーン上にGUIウィンドウを作成し,白黒画像を表示しています.

cv2.waitKey()

cv2.destroyAllWindows()

5行目では,cv2.waitKey() メソッドを用いて,ユーザが閉じるボタン,キー,または指定されたキーを押すまで待つことにしました.キーが押されたことを検出したら、コントロールを解放して、6行目(cv2.destroyAllWindows())に制御を渡し、GUI ウィンドウを閉じて破棄します。

8.Add 関数を使って 2 つの画像を加算する方法

imagePotrait = cv2.imread(“victory.png”, cv2.IMREAD_COLOR)

imageLogo = cv2.imread(“logo-creative.png”, cv2.IMREAD_COLOR)

 #読み込んだ画像には同じサイズを設定する必要があります。

#add メソッドを使う前に,両方の画像のサイズを同じにする必要があります.

imagePotrait = cv2.resize(imagePotrait, (250,250))

imageLogo = cv2.resize(imageLogo, (250,250))

 #add メソッド

addedImage = cv2.add(imagePotrait, imageLogo)

cv2.imshow(“Added Image”, addedImage)

cv2.waitKey()

cv2.destroyAllWindows()

imagePotrait = cv2.imread(“victory.png”, cv2.IMREAD_COLOR)

imageLogo = cv2.imread(“logo-creative.png”, cv2.IMREAD_COLOR)

1行目と2行目では,cv2.imread メソッドを使って,両方の画像をカラーフォーマットで読み込んでいます.

imagePotrait = cv2.resize(imagePotrait, (250,250))

imageLogo = cv2.resize(imageLogo, (250,250))

6行目と7行目では,cv2.resize メソッドを使って2つの画像のサイズを変更し,cv2.add で使用できるようにしました.cv2.add を使うためには,両方の画像に同じサイズを設定する必要があります.もし,両方の画像に同じサイズを設定しないと,cv2.add を使用する際にエラーが発生します.

addedImage = cv2.add(imagePotrait, imageLogo)

最後に,第 10 章では,両方の画像を追加するために cv2.add メソッドを使いました.このメソッドでは,引数として 1 枚目と 2 枚目の画像を渡す必要があります.

cv2.imshow(“Added Image”, addedImage)

11 行目では,cv2.imshow() メソッドを用いて,追加された画像を表示するための GUI ウィンドウをスクリーン上に作成しています.

cv2.waitKey()

cv2.destroyAllWindows()

十二行目では,cv2.waitKey() メソッドを用いて,ユーザが閉じるボタンやキー,あるいは指定されたキーを押すまで待つことにしました.

キーが押されたことが検出されると、コントロールを解放して、13行目(cv2.destroyAllWindows())に制御を渡し、GUIウィンドウを閉じて破棄します。

9.cv2.addWeighted メソッドを使って,2つの値を足す方法。

 

imagePotrait = cv2.imread(“victory.png”, cv2.IMREAD_COLOR)

imageLogo = cv2.imread(“logo-creative.png”, cv2.IMREAD_COLOR)

 #読み込んだ2つの画像に同じサイズを設定する必要があります。

#add メソッドを使う前に,両方の画像のサイズを同じにする必要があります.

imagePotrait = cv2.resize(imagePotrait, (250,250))

imageLogo = cv2.resize(imageLogo, (250,250))

 #add メソッド

addedImage = cv2.addWeighted(imagePotrait, 0.8, imageLogo, 0.2, 0)

cv2.imshow(“Added Image”, addedImage)

cv2.waitKey()

cv2.destroyAllWindows()

imagePotrait = cv2.imread(“victory.png”, cv2.IMREAD_COLOR)

imageLogo = cv2.imread(“logo-creative.png”, cv2.IMREAD_COLOR)

1行目と2行目では,画像を読み込むために cv2.imread メソッドを使い,カラーフォーマットで画像を読み込むためのフラグを渡しています.

imagePotrait = cv2.resize(imagePotrait, (250,250))

imageLogo = cv2.resize(imageLogo, (250,250))

cv2.add メソッドと同じように,6行目と7行目で cv2.resize を使って2つの画像のサイズを変更し,cv2.addWeighted で使用できるようにしました.cv2.addWeighted を使うためには,両方の画像に同じサイズを設定する必要があります.もし,両方の画像に同じサイズを設定しないと,cv2.addWeighted を利用する際にエラーが発生します.

addedImage = cv2.addWeighted(imagePotrait, 0.8, imageLogo, 0.2, 0)

10行目では,cv2.addWeighted メソッドを用いて,2つの画像を加算しています.

cv2.addWeighted(imagePotrait, 0.8, imageLogo, 0.2, 0)

このメソッドをより深く理解しましょう.

第1引数には,1つ目の画像配列を渡し,第2引数には,1つ目の画像配列の輝度/強度レベルを設定するアルファ値を渡します.第3引数では、第2画像配列を渡す必要があり、第4引数では、第2配列の明るさレベル/強度を設定するベータ値を与える必要がある。5番目の引数にはガンマ値を渡す必要があり、これは両方の画像配列の合計にガンマ値を加えることになります。

使用例:1枚目の画像に2枚目の画像を透かしとして追加したい場合は、必要に応じてアルファ値(floatデータ型である必要があります)を大きくし、ベータ値(floatデータ型である必要があります)を小さくしてみてください。もし、出力に満足できない場合は、アルファ値とベータ値を少し変えてみてください。

cv2.imshow(“Added Image”, addedImage)

11行目では,cv2.imshow()メソッドを用いて,追加された画像を表示するためのGUIウィンドウをスクリーン上に作成しました.

cv2.waitKey()

cv2.destroyAllWindows()

十二行目では,cv2.waitKey() メソッドを用いて,ユーザが閉じるボタンやキー,あるいは指定されたキーを押すまで待つことにしました.キーが押されたことが検出されると、コントロールを解放して、13行目(cv2.distroyAllWindows())にコントロールを渡し、GUIウィンドウを閉じて破棄します。OpenCVチュートリアルシリーズの第1部を読んでいない方は、ここをクリックして、OpenCVチュートリアルシリーズの第1部をご覧ください。

いかがでしたでしょうか。これにてopenCVに関する入門編は終了します。時期は未定ですが、中級編、上級編と継続して投稿する予定なので次回作をぜひとも心待ちにして頂けると幸いです。

 

 

プログラミングカテゴリの最新記事