Python OpenCV 강좌 : 제 30강 - 이미지 연산 (1)

Python OpenCV Image Calculation (1)

Python OpenCV 강좌 : 제 30강 - 이미지 연산 (1)
[ Python-OpenCV ] - 윤대희

이미지 연산(Image Calculation)


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

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

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



Main Code


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()



Detailed Code


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



Additional Information


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]\) 가 됩니다.



Result


2


도움이 되셨다면 광고 클릭 부탁드립니다.


Book Image

책이 출간되었습니다!

C#과 파이썬을 활용한 OpenCV 4 프로그래밍

컴퓨터 비전 기초 이론부터 머신러닝을 활용한 영상 처리 프로젝트까지

  • C# OpenCvSharp4
  • Python OpenCV4
  • Using Tesseract
  • Using TensorFlow
  • Using Regular Expression
  • 윤대희 저 | 위키북스

    [yes24 바로가기] [알라딘 바로가기] [교보문고 바로가기]


    ⤧  Previous post Python OpenCV 강좌 : 제 29강 - 원 검출 ⤧  Next post Python OpenCV 강좌 : 제 31강 - 이미지 연산 (2)
    Python-OpenCV Category