파이썬 강의/openCV

파이썬 oepnCV 11. 비트 연산 (bitwise operation)

마리사라 2020. 11. 23. 15:31
반응형

파이썬 openCV 11번째 강의는 비트 연산 (bitwise operation)입니다. 기본적으로 비트 연산은 openCV에서 자체적으로 지원하는 연산이기도 하고, 원리도 그렇게 어렵지 않으니 자체 지원 함수를 사용하여 빠르게 넘어가겠습니다.


0. 비트 연산 (bitwise operation)?

1비트는 0과 1로 이루어진 디지털 세계에서의 최소 단위입니다. 하지만 기본적인 영상은 R, G, B로 이루어진 0부터 255 사이의 값을 가진 3차원 행렬입니다. 그레이 스케일을 예시로 들어도 0부터 255를 가진 1차원 행렬입니다. 즉 비트와는 크게 상관이 없다는 이야기입니다.

 

하지만 우리는 이전에 영상을 이진법처럼 분류하는 방법을 배운 적이 있습니다.

2020/11/14 - [파이썬/openCV] - 파이썬 openCV 1. 이진화(binarization, thresholding)

 

파이썬 openCV 1. 이진화(binarization, thresholding)

파이썬 openCV의 첫 번째 강의 이진화(binarization, thresholding)입니다. 이진화는 이름에서 알 수 있듯이, 영상(사진)을 이진법처럼 두 가지로만 분류하는 것입니다. openCV에서 이진화는 기존의 영상을

marisara.tistory.com

 

즉 이미지를 이진화시키면 0과 255밖에 없는 영상이 만들어지고, 0과 1로 이루어진 비트와 다름이 없기에, 비트 연산이 가능해지는 것입니다.


1. openCV에서의 비트 연산

비트 연산은 크게 4가지로 나누어집니다. 두 개의 비트가 모두 1인 경우 우 1을 반환하는 and 연산, 두 개의 비트 중 하나라도 1이면 1을 반환하는 or연산, 원래의 비트를 반전시키는 not연산, 두 개의 비트가 같으면 0, 다르면 1을 반환하는 xor로 나뉩니다.

 

openCV에서도 똑같이 4개의 연산이 존재합니다.

 

img1 = cv2.imread("lenna.png")
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
ret1, out1 = cv2.threshold(gray1, 128, 255, cv2.THRESH_BINARY)

img2 = cv2.imread('peppers.png')
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret2, out2 = cv2.threshold(gray2, 128, 255, cv2.THRESH_BINARY)

항상 그렇듯, 이미지를 불러와주고, 그레이 스케일로 변환해 줍니다. 그 후 각각의 이미지를 이진 영상으로 만들어 줍니다.

 

bit_and = cv2.bitwise_and(out1, out2)
bit_or = cv2.bitwise_or(out1, out2)
bit_not = cv2.bitwise_not(out1)
bit_xor = cv2.bitwise_xor(out1, out2)

이제 비트 연산을 해줍니다. 비트 연산은 cv2.bitwise_원하는 연산으로 되어있습니다. 이때 not연산은 원래의 이미지의 반전이기 때문에, 입력값이 이미지 하나만 들어갑니다.

 

 

이제 결과를 보겠습니다.

원본 영상 1
원본 영상 2
and 연산
or 연산
not 연산
xor 연산

 

이렇게 이미지가 합쳐지거나 반전되었습니다.


2. 마치며

비트 연산을 굳이 중첩 for문을 사용해서, if문을 통해 처리할 수 있습니다. 하지만 속도도 느릴뿐더러, 비효율적이기에 내장 함수를 사용하였습니다.

 

 

import cv2


img1 = cv2.imread("lenna.png")
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
ret1, out1 = cv2.threshold(gray1, 128, 255, cv2.THRESH_BINARY)

img2 = cv2.imread('peppers.png')
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret2, out2 = cv2.threshold(gray2, 128, 255, cv2.THRESH_BINARY)

bit_and = cv2.bitwise_and(out1, out2)
bit_or = cv2.bitwise_or(out1, out2)
bit_not = cv2.bitwise_not(out1)
bit_xor = cv2.bitwise_xor(out1, out2)

cv2.imshow("original1", out1)
cv2.imshow("original2", out2)
cv2.imshow('and', bit_and)
cv2.imshow('or', bit_or)
cv2.imshow('not', bit_not)
cv2.imshow('xor', bit_xor)
cv2.waitKey(0)

 

반응형