OpenCVで使われるbitwise_andとは?実例を通して徹底解説!?
今回はOpenCVで使われるbitwise_andに関して、実例を通して徹底解説致します。bitwise_andに関して詳しく知りたい、実例を通してbitwise_andに関して学びを深めたい方へおすすめです。
- OpenCVで使われるbitwise_andとは?
- bitwise_and関数を利用して画像がマスク(覆い隠す)される仕組み
- OpenCVで使われるbitwise_and関数の定義
- 【3選】画像をマスク(覆い隠し)するその他の関数を紹介
- まとめ
- 参考文献
執筆者 - おすすめの記事3選
OpenCVで使われるbitwise_andとは?
OpenCVで使われるbitwise_andとは、元画像をマスク(覆い隠す)するために利用する関数です。
具体的なイメージとしては、以下の「bitwise_and関数のイメージ画像」箇所を、イメージしてもらうと良いでしょう。
【元画像】
【マスク(覆い隠すための)画像】
【bitwise_and関数のイメージ画像(マスク(覆い隠すための)画像の白い部分が黒くなる、マスク(覆い隠すための)画像の黒い部分が元画像となる)】
bitwise_and関数を利用して画像がマスク(覆い隠す)される仕組み
早急にbitwise_and関数の定義から利用法を知りたい方は、次章で紹介する「OpenCVで使われるbitwise_and関数の定義」からご確認ください。
bitwise_and関数では、以下の5ステップを経て、画像のマスク(覆い隠し)を行います。
- 2枚の画像を用意します。(今回は元画像, マスク(覆い隠し)画像とします。)
- 元画像, マスク(覆い隠し)画像内の、同じ位置のある画素に注目します。(画素に関しては、以下の「画素に関する説明を行う画像」を参照ください。以下の「元画像, マスク(覆い隠し)画像内の、同じ位置のある画素に注目」画像の赤色箇所を、ある画素とします。)
- 元画像のある画素の値(40), マスク(覆い隠し)画像のある画素の値(112)をそれぞれ2進数に変換します。(元画像のある画素の値(40 ⏩ 00101000), マスク(覆い隠し)画像のある画素の値(112 ⏩ 01110000)とする。)
- 元画像のある画素の値(00101000), マスク(覆い隠し)画像のある画素の値(01110000)の論理積を行います。(00101000 AND 01110000 = 00100000 ⏩ 32とする。)
- 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とは、元画像をマスク(覆い隠す)するために利用する関数。
参考文献
- マスクとは?
- 画素とは?
- 論理積とは?
- 2進数とは?
- bitwise_and関数 - 公式ドキュメント
- 論理和とは?
- 排他的論理和とは?
- 論理否定とは?
- OpenCVで使われるbitwise_and関数に関するサンプルコード