본문 바로가기

OpenCV-Python

OpenCV Python 영상에서의 연산(+밝기 조절, 차이 확인)

영상에서의 연산이란 영상의 특정 좌표 픽셀 값을 변경하여 출력 영상의 해당 좌표 픽셀 값으로 설정하는 연산을 의미합니다. 

opencv에서 색은 0~255로 표현되는데요 그렇기 때문에 OpenCV에선 위 그림과 같이 포화 연산(saturate 연산)이란 걸

합니다. 포화 연산은 연산 결과가 0보다 작으면 0으로, 255보다 크면 255로 설정하는 연산입니다.

 

그러면 연산 관련 함수에 대해 알아보겠습니다.


덧셈 연산 : cv2.add(src1, src2[, dst[, mask[, dtype]]]) [] : 생략 가능

import cv2
import numpy as np


src1 = cv2.imread('imgs/Lenna.png')

dst1 = cv2.add(src1, (200, 50, 50, 0)) # Blue 강조
dst2 = cv2.add(src1, (50, 200, 50, 0)) # Green 강조
dst3 = cv2.add(src1, (50, 50, 200, 0)) # Red 강조


cv2.imshow('src1', src1)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
cv2.imshow('dst3', dst3)
cv2.waitKey()
cv2.destroyAllWindows()

src1 : 입력 : 첫 번째 영상 또는 스칼라
src2 : 입력 : 두 번째 영상 또는 스칼라
dst : 출력 : 덧셈 연산의 결과 영상
mask : 마스크 영상
dtype : 출력 영상(dst)의 타입

 


밝기 조절 : 덧셈 연산을 이용

GRAYSCALE

import cv2
import numpy as np


src1 = cv2.imread('imgs/Lenna.png', cv2.IMREAD_GRAYSCALE)

dst1 = cv2.add(src1, 50)

cv2.imshow('src1', src1)
cv2.imshow('dst1', dst1)
cv2.waitKey()
cv2.destroyAllWindows()

GRAYSCALE 영상의 경우 채널이 1개로 0~255로 이루어져 단일 값만 적으셔도 됩니다.

출력 결과

COLOR

import cv2
import numpy as np


src1 = cv2.imread('imgs/Lenna.png')

dst1 = cv2.add(src1, (50, 50, 50, 0))

cv2.imshow('src1', src1)
cv2.imshow('dst1', dst1)
cv2.waitKey()
cv2.destroyAllWindows()

COLOR 영상은 BGR + alpha, 4 채널로 이루어져 있어 각 픽셀 값을 더해주는 배열 형태로 적어주어야 합니다.

 

출력  결과


가중치 합 : cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) [] : 생략 가능

import cv2
import numpy as np


src1 = cv2.imread('imgs/Lenna.png')
src2 = cv2.imread('imgs/img__.jpg')

dst1 = cv2.addWeighted(src1, 0.25, src2, 0.75, 0.0)
dst2 = cv2.addWeighted(src1, 0.5, src2, 0.5, 0.0)
dst3 = cv2.addWeighted(src1, 0.75, src2, 0.25, 0.0)

cv2.imshow('src1', src1)
cv2.imshow('src2', src2)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
cv2.imshow('dst3', dst3)

cv2.waitKey()
cv2.destroyAllWindows()

src1 : 첫 번째 영상
alpha : 첫 번째 영상 가중치
src2 : 두 번째 영상 src1과 같은 크기, 같은 타입
beta : 두 번째 영상 가중치
gamma  : 결과 영상에 추가적으로 더할 값
dst : 가중치 합 결과 영상
dtype : 출력 영상(dst)의 타입

 

dst1 : src1* 0.25, src2*0.75 / dst2 : src1* 0.5, src2*0.5 / dst3 : src1* 0.75, src2*0.25


뺄셈 연산 : cv2.subtract(src1, src2[, dst[, mask[, dtype]]]) [] : 생략 가능

import cv2
import numpy as np

src1 = cv2.imread('imgs/Lenna.png')
src2 = cv2.imread('imgs/square.png')

dst1 = cv2.subtract(src1, src2)

cv2.imshow('src1', src1)
cv2.imshow('src2', src2)
cv2.imshow('dst1', dst1)

cv2.waitKey()
cv2.destroyAllWindows()

src1 : 입력 : 첫 번째 영상 또는 스칼라
src2 : 입력 : 두 번째 영상 또는 스칼라
dst : 출력 : 뺄셈 연산의 결과 영상
mask : 마스크 영상
dtype : 출력 영상(dst)의 타입

 

※ 픽셀 값은 흰색이 255, 검은색이 0으로 src1 - src2를 하였을 때 src2의 흰색 부분이 0이 됩니다.


차이 연산 : cv2.absdiff(src1, src2[, dst]) [] : 생략 가능

import cv2
import numpy as np

src1 = cv2.imread('imgs/Lenna.png')
src2 = cv2.imread('imgs/Lenna__.png')

dst1 = cv2.absdiff(src1, src2)

cv2.imshow('src1', src1)
cv2.imshow('src2', src2)
cv2.imshow('dst1', dst1)

cv2.waitKey()
cv2.destroyAllWindows()

src1 : 첫 번째 영상
src2 : 두 번째 영상
dst : 차이 연산 결과 영상

두 영상의 차이를 찾을 때 사용합니다. 

src2에 낙서를 해놓았는데 그 부분만 따로 나타나는 것을 확인하실 수 있습니다.

색깔이 저렇게 나타나는 이유는 뺄셈 연산은 src1 픽셀 값 - src2 픽셀 값이지만

차이 연산은 뺄셈 연산에 젋댓값을 씌운 | src1 픽셀 값 - src2 픽셀 값 | 이기 때문입니다.