[OpenCv-python 기초 사용법] 이미지 연산처리를 통해 합성하기
2018. 5. 31. 22:40ㆍPython-이론/python-opencv
이미지 연산처리를 통해 합성하기
1 단순히 더해보기
우선 이기능을 실행 시키기 위해선 두 이미지의 크기가 동일해야한다. 만약 +를 이용해서 더했을 때는 255가 넘어가면 256을 나눈 값으로 대체한다. 하지만 cv2.add(src1, src2)를 사용할때 에는 255보다 크면 그냥 255로 값을 정한다.
예제 코드
import cv2 import numpy ironMan = cv2.imread('images/ironMan.PNG') thor = cv2.imread('images/thor.jpg') thor = cv2.resize(thor, None, fx=702/thor.shape[1], fy=400/thor.shape[0]) #둘의 이미지크기를 같게 만들어줌 plusImg = ironMan+thor addImg = cv2.add(ironMan, thor) cv2.imshow('originalironMan',ironMan) cv2.imshow('originalThor',thor) cv2.imshow('justPlus', plusImg) cv2.imshow('add', addImg) cv2.waitKey(0) cv2.destroyAllWindows()
이미지 블렌딩하기
예제 코드
이미지 비트 연산
이번에는 트랙바를 만들어서 옮기면 이미지가 서서히 바뀌는 블렌딩효과를 주어보겠다. 우선 블렌딩 함수에 대해 알아보자
알파 값은 우리가 트랙바를 통해 줄 값이고 f0(X)는 첫 이미지, f1(X)는 두번째 이미지 1-알파 값에 의해 어느 이미지를 더 강조하게 되는지 위의 함수를 보면 쉽게 이해 할 수 있을 것이다.
예제 코드
import cv2 import numpy def onChange(x): pass ironMan = cv2.imread('images/ironMan.PNG') thor = cv2.imread('images/thor.jpg') thor = cv2.resize(thor, None, fx=702/thor.shape[1], fy=400/thor.shape[0]) cv2.namedWindow('blending', cv2.WINDOW_NORMAL) cv2.createTrackbar('blending %','blending', 1, 100, onChange) while True: i = cv2.getTrackbarPos('blending %', 'blending') img = cv2.addWeighted(ironMan, float(100-i)/100, thor, float(i)/100, 0) #블렌딩 함수 구현 cv2.imshow('blending', img) k = cv2.waitKey(1) if k == 27: break cv2.destroyAllWindows()
이미지 비트 연산
이미지를 not, or, and, xor 등으로 연산을 계산해보겠습니다. 우리가 할것은 토니스타크의 회사인 스타크 인더스트리를 아이언맨 옆에 추가시켜 보겠습니다.
import cv2 import numpy ironMan = cv2.imread('images/ironMan.PNG') stark = cv2.imread('images/stark3.png') cutImg = ironMan[0:225, 0:225]#스타크사 이미지 넣을 공간을 스타크 이미지의 크기만큼 짜른다. grayStark = cv2.cvtColor(stark, cv2.COLOR_BGR2GRAY) ret, mask = cv2.threshold(grayStark, 100, 255, cv2.THRESH_BINARY)#문턱값을 설정하는 것인데 간단히 설명하면 제일 마지막 인자를 써주면 픽셀값이 75만 넘으면 그값을 225로 바꾸어 준다 라는 뜻이다 mask_inv = cv2.bitwise_not(mask) #하얀색 배경의 스타크사 이미지를 얻을 수 있다. fg = cv2.bitwise_and(stark, stark, mask=mask) #마스크는 잘보면 스타크 사는 흰색이고 배경은 검은색이다. #따라서 and연산자를 사용하기 때문에 일반 스타크 이미지와 같은것은 1 다른것은 0으로 표현한다. #검은화면에 원래색의 스타크사만 남게된 것이다. bg = cv2.bitwise_and(cutImg, cutImg, mask=mask_inv) #not 마스크는 배경이 흰색 스타크 사는 검은 색이다. # 따라서 원래의 배경에 검은색의 스타크 사만 남게 된다. img = cv2.add(fg,bg) #둘을 더해주면 짜른 부위에 원래의 스타크 사 이미지가 들어가게된다. ironMan[0:225, 0:225] = img #대입시켜주면 아이언맨 이미지에 스타크 사가 들어간 것을 알 수 있다. cv2.imshow('result', ironMan) cv2.imshow('mask', mask) cv2.imshow('mask_inv', mask_inv) cv2.imshow('fg', fg) cv2.imshow('bg', bg) cv2.waitKey(0) cv2.destroyAllWindows()
위의 코드에 나오는 문턱값은 제일 마지막 인자에 따라 사용도가 다르기 때문에 다른강의에 적겠다.
'Python-이론 > python-opencv' 카테고리의 다른 글
[OpenCV-python] adaptive Threshold (0) | 2018.06.06 |
---|---|
[OpenCv-python 사용법] global Threshold (0) | 2018.06.06 |
[OpenCV-python 기초]:이미지 픽셀 조작 및 ROI(관심영역) (0) | 2018.05.30 |
[OpenCv-python 기초 ]:trackBar 생성하기 (0) | 2018.05.30 |
[OpenCv-python 기초 : 마우스 클릭으로 도형 만들기 (0) | 2018.05.30 |