상위 목록: 하위 목록: 작성 날짜: 읽는 데 11 분 소요

이미지 연산(Image Calculation)

이미지 연산은 하나 또는 둘 이상의 이미지에 대해 수학적인 연산을 수행합니다.

Numpy 클래스의 배열 연산과 동일하거나 비슷한 의미와 결과를 갖습니다.

또한, 대수적 표현(+, - 등)을 통해 Mat 클래스 간의 연산을 수행할 수 있습니다.



메인 코드

import numpy as np
import cv2

src = cv2.imread("pencils.jpg")
number1 = np.ones_like(src) * 127
number2 = np.ones_like(src) * 2

add = cv2.add(src, number1)
sub = cv2.subtract(src, number1)
mul = cv2.multiply(src, number2)
div = cv2.divide(src, number2)

src = np.concatenate((src, src, src, src), axis = 1)
number = np.concatenate((number1, number1, number2, number2), axis = 1)
dst = np.concatenate((add, sub, mul, div), axis = 1)

dst = np.concatenate((src, number, dst), axis = 0)

cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()


세부 코드

src = cv2.imread("pencils.jpg")
number1 = np.ones_like(src) * 127
number2 = np.ones_like(src) * 2

원본 이미지(src)연산 값(number1, number2)을 선언합니다.

연산 이미지는 회색 이미지(127, 127, 127)검은색 이미지(2, 2, 2)를 사용합니다.


add = cv2.add(src, number1)
sub = cv2.subtract(src, number1)
mul = cv2.multiply(src, number2)
div = cv2.divide(src, number2)

cv2.Calc(연산 이미지1, 연산 이미지2)를 이용하여 이미지 연산을 진행합니다.

덧셈(add), 뺄셈(subtract), 곱셈(multiply), 나눗셈(divide) 등으로 연산이 가능합니다.

결괏값이 0보다 작다면, 0으로 반환되며, 결괏값이 255보다 크다면, 255로 반환됩니다.

만약, 대수적 표현(+, - 등)을 통해 연산을 진행한다면, 오버플로우(Overflow)언더플로우(Underflow)가 발생합니다.

즉, 0 - 2를 진행한다면 -1이 아닌, 255값이 됩니다.

이미지는 uint8로, 256개의 공간(0 ~ 255)을 갖고 있습니다.

..., 253, 254, 255, 0, 1, 2, 3, ...이므로, 255값을 반환합니다.


src = np.concatenate((src, src, src, src), axis = 1)
number = np.concatenate((number1, number1, number2, number2), axis = 1)
dst = np.concatenate((add, sub, mul, div), axis = 1)

dst = np.concatenate((src, number, dst), axis = 0)

연결 함수(np.concatenate)로 이미지들을 연결합니다.

결과 이미지는 다음과 같이 구성됩니다.


src src src src
number1 number1 number2 number2
add sub mul div



추가 정보

src = cv2.imread("pencils.jpg")
number1 = 127 ## np.ones_like(src) * 127
number2 = 2   ## np.ones_like(src) * 2

여기서 연산값을 np.ones_like(src) * N이 아닌 N으로 선언해도 연산이 가능합니다.

단, 이 연산은 브로드캐스팅(Broadcasting)이 적용돼, [src.height, src.width, 1]이 됩니다.

즉, 단일 채널 이미지가 되며 원본 이미지의 첫 번째 채널에만 연산됩니다.

number1가 N이라면 \([1, 0, 182] + N = [1 + N, 0, 182]\) 가 됩니다.



출력 결과

댓글 남기기