본문 바로가기
  • 紹睿: 자유롭고 더불어 사는 가치있는 삶
Project/데이터 가지고 놀기

pixel-art :: openCV 기초 (3) - 이미지 연산

by 징여 2018. 3. 6.
반응형

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, (10001000))
img4 = cv2.resize(img2, (10001000))
 
titles = ['img1''img2']
images=[img3, img4]
 
for i in range(2):
    plt.subplot(12, 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(12, 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()를 쓰면된다.


반응형

댓글