Pynote

Python、機械学習、画像処理について

ピクセルごとの論理演算

ピクセルごとの論理演算について

2つの2値化されている画像を入力として、ピクセルごとに論理演算を行うと、新たな画像を生成できる。

キーワード

  • 画像2値化 (Image Thresholding, Binarization)
  • 画像分割 (Image Segmentation)

手順

今回使用する入力画像を2つ作成します。

f:id:nekobean:20171202160124p:plain
画像1

f:id:nekobean:20171202160134p:plain
画像2

ピクセルごとに AND 演算

dst = cv2.bitwise_and(src1, src2[, dst[, mask]])
  • 引数
    • src1: 入力画像1
    • src2: 入力画像2
    • dst: 引数経由で出力を受け取る場合は指定
    • mask: マスク領域 (後述)
  • 返り値

f:id:nekobean:20171202160645p:plain

ピクセルごとに OR 演算

dst = cv2.bitwise_or(src1, src2[, dst[, mask]])
  • 引数
    • src1: 入力画像1
    • src2: 入力画像2
    • dst: 引数経由で出力を受け取る場合は指定
    • mask: マスク領域 (後述)
  • 返り値

f:id:nekobean:20171202161154p:plain

ピクセルごとに XOR 演算

dst = cv2.bitwise_xor(src1, src2[, dst[, mask]])
  • 引数
    • src1: 入力画像1
    • src2: 入力画像2
    • dst: 引数経由で出力を受け取る場合は指定
    • mask: マスク領域 (後述)
  • 返り値

f:id:nekobean:20171202161139p:plain

ピクセルごとに NOT 演算

dst = cv2.bitwise_not(src[, dst[, mask]])
  • 引数
    • src: 入力画像1
    • dst: 引数経由で出力を受け取る場合は指定
    • mask: マスク領域 (後述)
  • 返り値

f:id:nekobean:20171202161127p:plain

サンプルコード

# encoding: utf-8
import cv2
import numpy as np

# 入力画像1を作成する。
src1 = np.zeros((300, 300), dtype=np.uint8)
cv2.circle(src1, center=(100, 100), radius=100, color=255, thickness=-1)

# 入力画像2を作成する。
src2 = np.zeros((300, 300), dtype=np.uint8)
cv2.circle(src2, center=(200, 200), radius=100, color=255, thickness=-1)

cv2.imwrite("src1.png", src1)
cv2.imwrite("src2.png", src2)

# and
bitwise_and = cv2.bitwise_and(src1, src2)
cv2.imwrite("bitwise_and.png", bitwise_and)

# or
bitwise_or = cv2.bitwise_or(src1, src2)
cv2.imwrite("bitwise_or.png", bitwise_or)

# xor
bitwise_xor = cv2.bitwise_xor(src1, src2)
cv2.imwrite("bitwise_xor.png", bitwise_xor)

# not
bitwise_not = cv2.bitwise_not(src1)
cv2.imwrite("bitwise_not.png", bitwise_not)

マスク領域

演算対象外としたい領域を 0 とした画像を与えることで処理を行う範囲を限定できる。

f:id:nekobean:20171202162411p:plain
入力画像

f:id:nekobean:20171202162439p:plain
マスク画像

# encoding: utf-8
import cv2
import numpy as np

# 入力画像1を作成する。
src = np.zeros((300, 300), dtype=np.uint8)
cv2.rectangle(src, pt1=(0, 0), pt2=(200, 200), color=0, thickness=-1)

# 入力画像2を作成する。
mask = np.full((300, 300), 255, dtype=np.uint8)
cv2.rectangle(mask, pt1=(0, 0), pt2=(100, 100), color=0, thickness=-1)

cv2.imwrite("src.png", src)
cv2.imwrite("mask.png", mask)

# not
bitwise_not = cv2.bitwise_not(src, mask=mask)
cv2.imwrite("bitwise_not.png", bitwise_not)

f:id:nekobean:20171202162416p:plain