pixel-art :: openCV 기초 (3) - 이미지 연산
opencv를 이용한 이미지의 더하기
방법1. cv2.add()
방법2. numpy 연산 (img1+ img2)
이 두가지의 차이는 cv2.add()는 saturation 연산을 이용하고
numpy는 modulo연산을 한다는 점이다.
saturation 연산은 한계값을 정하고 그 값을 벗어나는 경우 모두 특정값으로 나타내는 경우로 이미지에서 0 이하는 모두 0, 255 이상은 모두 255로 표현된다.
modulo 연산은 a와 b는 n으로 나눈 나머지 값이 같다는 의미로 이미지에서는 연산의 결과가 256보다 큰 경우 256로 나눈 나머지 값으로 결정한다.
코드를 통해 살펴보면 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import cv2 import numpy as np from matplotlib import pyplot as plt img1 = cv2.imread('pic/image1.jpeg') img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB) img2 = cv2.imread('pic/image2.jpg') img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB) print(img1.shape, img2.shape) # (699, 699, 3) (3264, 4912, 3) #이미지의 크기가 다르기 때문에 img3 = cv2.resize(img1, (1000, 1000)) img4 = cv2.resize(img2, (1000, 1000)) titles = ['img1', 'img2'] images=[img3, img4] for i in range(2): plt.subplot(1, 2, i+1), plt.title(titles[i]), plt.imshow(images[i]) plt.xticks([]), plt.yticks([]) plt.show() | cs |
1 2 3 4 5 6 7 8 9 10 | img5 = cv2.add(img3, img4) img6 = img3+img4 titles = ['cv2', 'numpy'] images=[img5, img6] for i in range(2): plt.subplot(1, 2, i+1), plt.title(titles[i]), plt.imshow(images[i]) plt.xticks([]), plt.yticks([]) plt.show() | cs |
두개의 결과 값이 다른 것을 알 수 있다.
Digital image
Digital image는 2차원 행렬의 형태로 표현되며, 각 격자가 하나의 pixel이 되기 때문에 bitmap image라고도 한다.
이런 Digital image의 유형에는 3가지가 있는데,
1. binary image: 1bit로 표현 (흰색과 검은색)
2. grayscale image: 8bit, 256단계의 명암을 표현
3.color image: 24bit, 총 16,777,216가지의 색 표현
- blue: (255, 0, 0)
- Green: (0, 255, 0)
- Red: (0, 0, 255)
- White: (255, 255, 255)
- Black: (0, 0, 0)
1 2 3 4 | import cv2 flags = [i for i in dir(cv2)if i.startswith('COLOR_')] print(flags) # print(len(flags)) 274 | cs |
opencv에서는 274정도 제공하는가보다...
Color-space 변환은 우리가 여태까지 사용했던, cv2.cvtColor()를 쓰면된다.