Python OpenCV - 비트 연산

BANG·2020년 11월 28일
0

OpenCV

목록 보기
16/16

비트 연산

  • threshold : 이미지에서 픽셀값이 임계값보다 크거나 작을 때, 각각 설정한 값으로 할당하기
    • threshold를 하기 위해서는 이미지를 grayscale로 변환해야 함
    • 이진화(흑/백)하기 위한 기준값(임계값)
import cv2
import numpy as np
 
# 이미지 읽어오기
src1 = cv2.imread('./data/lena.jpg')
src2 = cv2.imread('./data/opencv_logo.png')
cv2.imshow('src2',  src2)
 
#1 
rows,cols,channels = src2.shape	 # 삽입할 이미지의 row, col, channel정보
roi = src1[0:rows, 0:cols]	# 관심영역 지정
 
#2
# 로고 이미지를 grayscale하기
gray = cv2.cvtColor(src2,cv2.COLOR_BGR2GRAY)
 
# cv2.threshold(gray이미지, 임계값, 임계값보다 클 때 적용할 값, thresholding 타입)
# THRESH_BINARY : 픽셀값이 임계값(160)보다 크면 value(255, 흰색)이고 아니면 0(검정색)으로 바꾸기
ret, mask = cv2.threshold(gray, 160, 255, cv2.THRESH_BINARY)
 
#print(ret, type(ret))   # 160.0, <class 'float'>
#print(mask, type(mask)) # threshold된 이미지(흑백 이미지), <class 'numpy.ndarray'>
 
# 부정(bitwise_not)연산 : not연산(반대로 하기)
mask_inv = cv2.bitwise_not(mask)
 
cv2.imshow('mask',  mask)	# 부정(bitwise_not)연산 전
cv2.imshow('mask_inv',  mask_inv)	# 부정(bitwise_not)연산 후
 
#3
# 논리곱(bitwise_and) : and연산(둘다 1일 때만 1이 됨)
# mask의 값이 0(검정색)이 아닌 부분에서만 roi, roi를 and연산 진행
# roi에서 로고에 해당하는 부분만 검정색으로 만들기
src1_bg = cv2.bitwise_and(roi, roi, mask = mask)
 
cv2.imshow('src1_bg',  src1_bg)
 
#4
# 논리곱(bitwise_and) : and연산(둘다 1일 때만 1이 됨)
# mask의 값이 0(검정색)이 아닌 부분에서만 src2, src2를 and연산 진행
# 로고 이미지에서 로고 부분만 추출
src2_fg = cv2.bitwise_and(src2, src2, mask = mask_inv)
 
cv2.imshow('src2_fg',  src2_fg)
 
#5
# 논리합(bitwise_or) : or연산(둘 중 하나만 1이면 1이 됨)
# dst = cv2.add(src1_bg, src2_fg)로 논리합(bitwise_or)연산 대체 가능
# 로고 이미지 배경을 투명으로 만들고 roi에 로고 이미지 넣기
dst = cv2.bitwise_or(src1_bg, src2_fg)
 
cv2.imshow('dst',  dst)
 
#6 최종적인 이미지 생성
src1[0:rows, 0:cols] = dst	# 관심 영역을 원본에 붙여넣기
 
cv2.imshow('result',src1)
cv2.waitKey(0)
cv2.destroyAllWindows()
profile
Record Everything!!

0개의 댓글