본문 바로가기
Python/Computer Vision

[파이썬, Python] OpenCV - 영상의 화소 처리

by coding-choonsik 2023. 8. 24.
728x90
반응형
SMALL

1. 영상의 화소처리

  • 영상의 특정 좌표 픽셀값으 변경하여 출력 영상의 좌표 픽셀을 설정하는 모든 연산

 

1-1.  밝기 조절

  • 영상을 전체적으로 밝게하거나 어둡게 하는 연산
    • cv2.add(첫번째 영상, 두번째 영상)
    • cv2.subtract(첫번째 영상, 두번째 영상)
    • cv2.multiply(첫번째 영상, 두번째 영상)
    • cv2.divide(첫번째 영상, 두번째 영상)
import cv2

src1 = cv2.imread('dog.bmp', cv2.IMREAD_GRAYSCALE)
src2 = cv2.imread('dog.bmp')

# src1, src2의 픽셀값에 100씩 더해줌
dst1 = cv2.add(src1, 100)
print('dst1: ', dst1)
print('---------------')
dst2 = cv2.add(src2, (100, 100, 100, 0)) # 컬러값을 나타내는 bmp파일이기 때문에 4채널

dst3 = cv2.subtract(src1, 100)
print(dst3)
print('---------------')
dst4 = cv2.multiply(src1, 10)
print(dst4)
print('---------------')
dst5 = cv2.divide(src1, 10)
print(dst5)
print('---------------')

>>> 
dst1:  [[177 191 198 ... 139 139 139]
 [171 181 193 ... 134 131 128]
 [163 163 171 ... 135 129 124]
 ...
 [188 193 195 ... 222 229 219]
 [179 187 191 ... 221 215 220]
 [170 174 181 ... 220 232 215]]
---------------
[[ 0  0  0 ...  0  0  0]
 [ 0  0  0 ...  0  0  0]
 [ 0  0  0 ...  0  0  0]
 ...
 [ 0  0  0 ... 22 29 19]
 [ 0  0  0 ... 21 15 20]
 [ 0  0  0 ... 20 32 15]]
---------------
[[255 255 255 ... 255 255 255]
 [255 255 255 ... 255 255 255]
 [255 255 255 ... 255 255 240]
 ...
 [255 255 255 ... 255 255 255]
 [255 255 255 ... 255 255 255]
 [255 255 255 ... 255 255 255]]
---------------
[[ 8  9 10 ...  4  4  4]
 [ 7  8  9 ...  3  3  3]
 [ 6  6  7 ...  4  3  2]
 ...
 [ 9  9 10 ... 12 13 12]
 [ 8  9  9 ... 12 12 12]
 [ 7  7  8 ... 12 13 12]]
---------------




cv2.imshow('src1', src1)
cv2.imshow('src2', src2)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
cv2.imshow('dst5', dst5)
cv2.waitKey()

 

▲ src1 과 src2
▲ 차례대로 dst1, 2, 5


✅ 같은 크기의 두 영상을 add 연산하기

import cv2
import matplotlib.pyplot as plt

# 같은 크기의 두 이미지를 add 연산해보기
src1 = cv2.imread('cat1.jpg')
src2 = cv2.imread('cat2.jpg')

dst1 = src1 + src2  # 0 ~ 255 범위가 아닌 결과가 있음
dst2 = cv2.add(src1, src2)  # 0 ~ 255 범위로 연산

img = {'src1': src1, 'src2': src2, 'dst1': dst1, 'dst2':dst2}

for i, (k, v) in enumerate(img.items()):
    plt.subplot(2,2,i+1)
    plt.imshow(v[:, :, ::-1])  # ::-1을 사용하면 BGR(파랑, 녹색, 빨강)로 색상 채널이 바뀜(matplotlib)
    plt.title(k)
plt.show()


1-2. 가중치 합(weighted sum)

  • 두 영상의 같은 위치에 존재하는 픽셀값에 대하여 가중합을 계산해서 결과 영상의 픽셀값으로 설정
  • cv2.addWeighted(첫번째 영상, 알파값,  두번째 영상, 감마값)
    • 알파값: 첫번째 영상에 지정할 가중치, 가중치의 합은 1 
    • 감마값: 연산 결과에 가감할 상수, 기본값은 0

 

✅ 크기가 같은 두 영상을 weighted sum

import cv2
import matplotlib.pyplot as plt
import numpy as np

src1 = cv2.imread('cat1.jpg')
src2 = cv2.imread('cat2.jpg')

alpha = 0.7

dst1 = src1 * alpha + src2 * (1-alpha)
dst1 = dst1.astype(np.uint8)
dst2 = cv2.addWeighted(src1, alpha, src2, (1-alpha), 0)  # 0 ~ 255 범위로 연산

cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
cv2.waitKey()

▲ dst1 과 dst2



1-3. 두 영상의 차이(absdiff)

  • 두 영상의 픽셀 값을 빼면 음수가 나올 수 있는데, 음수에 절대값을 취한 값
  • cv2.absdiff(첫번째 영상, 두번째 영상)

 

 

✅ 두 영상의 여러 연산을 matplotlib으로 나타내기

import cv2
import numpy as np
import matplotlib.pyplot as plt

# square.bmp (256*256)
# 같은 크기의 이미지와 연산
# add, addWeighted, subtract, absdiff
# matplotlib의 subplot을 이용해서 이미지 비교

src1 = cv2.imread('cat3.jpg')
src2 = cv2.imread('square.bmp')

dst1 = cv2.add(src1, src2)
dst2 = cv2.addWeighted(src1, 0.5, src2,0.5,0.0)  # 가중합
dst3 = cv2.subtract(src1, src2)   # 빼기 연산
dst4 = cv2.absdiff(src1, src2)	

img = {'dst1': dst1, 'dst2': dst2, 'dst3': dst3, 'dst4':dst4}

plt.figure(figsize=(9,8))
for i, (k, v) in enumerate(img.items()):
    plt.subplot(2,2,i+1)
    plt.imshow(v[:, :, ::-1])  # ::-1을 사용하면 BGR(파랑, 녹색, 빨강)로 색상 채널이 바뀜(matplotlib)
    plt.title(k)
plt.show()

 

 

728x90
반응형
LIST