KURORO BLOGのロゴ

このエントリーをはてなブックマークに追加
OpenCVで使われるbitwise_andとは?実例を通して徹底解説!?

OpenCVで使われるbitwise_andとは?実例を通して徹底解説!?

今回はOpenCVで使われるbitwise_andに関して、実例を通して徹底解説致します。bitwise_andに関して詳しく知りたい、実例を通してbitwise_andに関して学びを深めたい方へおすすめです。

目次
  1. OpenCVで使われるbitwise_andとは?
  2. bitwise_and関数を利用して画像がマスク(覆い隠す)される仕組み
  3. OpenCVで使われるbitwise_and関数の定義
  4. 【3選】画像をマスク(覆い隠し)するその他の関数を紹介
    1. bitwise_or
    2. bitwise_xor
    3. bitwise_not
  5. まとめ
  6. 参考文献
目次を開く⬇︎

執筆者 - おすすめの記事3選

OpenCVで使われるbitwise_andとは?

OpenCVで使われるbitwise_andとは、元画像をマスク(覆い隠す)するために利用する関数です。

具体的なイメージとしては、以下の「bitwise_and関数のイメージ画像」箇所を、イメージしてもらうと良いでしょう。

【元画像】

【マスク(覆い隠すための)画像】

【bitwise_and関数のイメージ画像(マスク(覆い隠すための)画像の白い部分が黒くなる、マスク(覆い隠すための)画像の黒い部分が元画像となる)】

bitwise_and関数を利用して画像がマスク(覆い隠す)される仕組み

早急にbitwise_and関数の定義から利用法を知りたい方は、次章で紹介する「OpenCVで使われるbitwise_and関数の定義」からご確認ください。

bitwise_and関数では、以下の5ステップを経て、画像のマスク(覆い隠し)を行います。

  1. 2枚の画像を用意します。(今回は元画像, マスク(覆い隠し)画像とします。)
  2. 元画像, マスク(覆い隠し)画像内の、同じ位置のある画素に注目します。(画素に関しては、以下の「画素に関する説明を行う画像」を参照ください。以下の「元画像, マスク(覆い隠し)画像内の、同じ位置のある画素に注目」画像の赤色箇所を、ある画素とします。)
  3. 元画像のある画素の値(40), マスク(覆い隠し)画像のある画素の値(112)をそれぞれ2進数に変換します。(元画像のある画素の値(40 ⏩ 00101000), マスク(覆い隠し)画像のある画素の値(112 ⏩ 01110000)とする。)
  4. 元画像のある画素の値(00101000), マスク(覆い隠し)画像のある画素の値(01110000)の論理積を行います。(00101000 AND 01110000 = 00100000 ⏩ 32とする。)
  5. 2~4を繰り返します。

【画素に関する説明を行う画像】

1枚の画像は、複数の画素の集まりで成り立っています。

【元画像, マスク(覆い隠し)画像内の、同じ位置のある画素に注目画像】

OpenCVで使われるbitwise_and関数の定義

bitwise_and関数は

1# cv2(OpenCV)を利用する宣言を行う。
2import cv2
3
4# bitwise_and関数 : 元画像をマスク(覆い隠す)するために利用する関数
5# bitwise_and関数 - 公式ドキュメント : https://docs.opencv.org/4.0.1/d2/de8/group__core__array.html#ga60b4d04b251ba5eb1392c34425497e14
6
7# 第一引数(必須) : 多次元配列(元画像情報)
8
9# 第二引数(必須) : 多次元配列(マスク(覆い隠し)画像情報)
10
11# 戻り値 : 多次元配列(画像情報)
12
13################################## 
14# 注意事項 #######
15# ※ 2つの画像サイズ + タイプが同じである必要があります。print(img1.shape, img2.shape), print(type(img1), type(img2))して、値が等しいことをご確認ください。
16# xxx.shape : 画像サイズを調べる。
17# type(xxx) : 画像タイプを調べる。
18# ※ resize(画像サイズを変更する)について : https://kuroro.blog/python/KznX7CJ9axPuNSYBQN6m/
19##################################
20dst = cv2.bitwise_and(img1, img2)

で定義されます。

例えば以下のようなコードを作成すると、

1import cv2
2import sys
3
4# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
5# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
6# 第一引数 : 画像のファイルパス
7# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
8img = cv2.imread("xxx.jpg")
9img2 = cv2.imread("yyy.jpg")
10
11# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
12if img is None:
13    sys.exit("Could not read the image.")
14
15# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
16if img2 is None:
17    sys.exit("Could not read the image.")
18
19# 画像サイズを合わせるために、調整する。
20# ※ 今回imgの画像が640x427だったため、(640, 427)とする。
21# resizeについて : https://kuroro.blog/python/KznX7CJ9axPuNSYBQN6m/
22img2 = cv2.resize(img2, (640, 427))
23
24print(type(img))
25print(img.shape)
26print(type(img2))
27print(img2.shape)
28
29# bitwise_and関数 : 元画像をマスク(覆い隠す)するために利用する関数
30
31# 第一引数(必須) : 多次元配列(numpy.ndarray)
32# 第二引数(必須) : 多次元配列(numpy.ndarray)
33# 戻り値 : 多次元配列(numpy.ndarray)
34output = cv2.bitwise_and(img, img2)
35
36# imwrite : 画像の保存を行う関数
37# 第一引数 : 保存先の画像ファイル名
38# 第二引数 : 多次元配列(numpy.ndarray)
39# <第二引数の例>
40# [
41# [
42# [234 237 228]
43# ...
44# [202 209 194]
45# ]
46# [
47# [10 27 16]
48# ...
49# [36 67 46]
50# ]
51# [
52# [34 51 40]
53# ...
54# [50 81 60]
55# ]
56# ]
57# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
58cv2.imwrite('output.jpg', output)

以下の画像のように、画像が描画されます。

【元画像】

【マスク(覆い隠すための)画像】

【bitwise_and関数を用いて元画像をマスク(覆い隠し)した画像】

imreadに関しては、OpenCVで使われるimreadとは?使い方から配列が画像になる仕組みを解説でまとめていますので、詳しく知りたい方は是非ご確認ください。

imwriteに関しては、OpenCVで使われるimwriteとは?imwriteの定義から使用例をご紹介でまとめていますので、詳しく知りたい方は是非ご確認ください。

resizeに関しては、OpenCVで使われるresizeとは?実例サンプルコード【4選】を一挙紹介でまとめていますので、詳しく知りたい方は是非ご確認ください。

【3選】画像をマスク(覆い隠し)するその他の関数を紹介

先ほどはOpenCVで使われるbitwise_and関数の定義から使い方までお伝えしました。今章では画像をマスク(覆い隠し)する、その他の関数3種類を丁寧に解説いたします。

bitwise_or

bitwise_or関数は、画像をマスク(覆い隠し)するために利用します。bitwise_and関数では論理積を用いて画素の値を変換しましたが、bitwise_orでは論理和を用いて画素の値を変換します。

例えば「OpenCVで使われるbitwise_and関数の定義」で紹介したコードのoutput = cv2.bitwise_and(img, img2)箇所を、以下のように変更すると、

1- output = cv2.bitwise_and(img, img2)
2+ output = cv2.bitwise_or(img, img2)

以下の画像のように、画像が描画されます。

【元画像】

【マスク(覆い隠すための)画像】

【bitwise_or関数を用いて元画像をマスク(覆い隠し)した画像】

bitwise_xor

bitwise_xor関数は、画像をマスク(覆い隠し)するために利用します。bitwise_and関数では論理積を用いて画素の値を変換しましたが、bitwise_xorでは排他的論理和を用いて画素の値を変換します。

例えば「OpenCVで使われるbitwise_and関数の定義」で紹介したコードのoutput = cv2.bitwise_and(img, img2)箇所を、以下のように変更すると、

1- output = cv2.bitwise_and(img, img2)
2+ output = cv2.bitwise_xor(img, img2)

以下の画像のように、画像が描画されます。

【元画像】

【マスク(覆い隠すための)画像】

【bitwise_xor関数を用いて元画像をマスク(覆い隠し)した画像】

bitwise_not

bitwise_not関数は、画像をマスク(覆い隠し)するために利用します。bitwise_and関数では論理積を用いて画素の値を変換しましたが、bitwise_notでは論理否定を用いて画素の値を変換します。

例えば「OpenCVで使われるbitwise_and関数の定義」で紹介したコードのoutput = cv2.bitwise_and(img, img2)箇所を、以下のように変更すると、

1- output = cv2.bitwise_and(img, img2)
2+ output = cv2.bitwise_not(img, img2)

以下の画像のように、画像が描画されます。

【元画像】

【マスク(覆い隠すための)画像】

【bitwise_not関数を用いて元画像をマスク(覆い隠し)した画像】

まとめ

  • OpenCVで使われるbitwise_andとは、元画像をマスク(覆い隠す)するために利用する関数

参考文献

記事に関するお問い合わせ