1. 영상의 화소처리
영상의 특정 좌표 픽셀값을 변경하여 출력 영상의 좌표 픽셀을 설정하는 모든 연산
🔴 밝기 조절: 영상을 전체적으로 밝게하거나 어둡게 하는 연산
cv2.add(첫번째 영상, 두번째 영상)
cv2.substract(첫번째 영상, 두번째 영상)
cv2.multiply(첫번째 영상, 두번째 영상)
cv2.divide(첫번째 영상, 두번째 영상)
cv2.addWeighted (첫번째 영상, 알파값, 두번째 영상, 1-알파값, 감마값)
# 두 영상의 같은 위치에 존재하는 칙셀값에 대하여 가중합을 계산해서 결과 영상의 칙셀값으로 설정
cv2.absdiff(첫번째 영상, 두번째 영상)
# 두 영상의 픽셀 값을 빼면 음수가 나올 수 있는데, 해당 값에 절대값을 취한 값
|
|
◼ 밝기조절(밝게하기)
import cv2
img1 = cv2.imread('./dog.bmp', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('./dog.bmp')
dst1 = cv2.add(img1, 100)
dst2 = cv2.add(img2, (100, 100, 100), 0)
cv2.imshow('img', img1)
cv2.imshow('img', img2)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
cv2.waitKey()
|
![]() ![]() ![]() |
◼ 밝기조절
dst3 = cv2.subtract(img1, 100)
dst4 = cv2.multiply(img1, 10)
dst5 = cv2.divide(img1, 10)
cv2.imshow('dst3', dst3)
cv2.imshow('dst4', dst4)
cv2.imshow('dst5', dst5)
|
![]() ![]() ![]() |
◼ 이미지 더하기 할 때 + 보다 add를 써야하는 이유
import cv2
import matplotlib.pyplot as plt
img1 = cv2.imread('./man.jpg')
img2 = cv2.imread('./turkey.jpg')
# img + img: 255를 넘어갈 경우 해당값의 256을 떼서 표현
dst1 = img1 + img2
# cv2.add():255를 넘어갈 경우 255로 고정
dst2 = cv2.add(img1, img2)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
cv2.waitKey()
|
![]() |
◼ 더한 이미지 matplot으로 보기
img = {'img1': img1, 'img2': img2, 'dst1':dst1, 'dst2':dst2}
for i, (k, v) in enumerate(img.items()):
plt.subplot(2, 2, i+1)
plt.imshow(v[:, :, ::-1])
plt.title(k)
plt.show()
|
![]() |
◼ 두 이미지를 블렌딩
import cv2
import matplotlib.pyplot as plt
import numpy as np
img1 = cv2.imread('./man.jpg')
img2 = cv2.imread('./turkey.jpg')
alpha = 0.7
dst1 = cv2.addWeighted(img1, alpha, img2, (1-alpha), 0)
dst2 = img1 * alpha + img2 * (1 - alpha)
dst2 = dst1.astype(np.uint8)
img = {'img1': img1, 'img2': img2, 'dst1':dst1, 'dst2':dst2}
for i, (k, v) in enumerate(img.items()):
plt.subplot(2, 2, i+1)
plt.imshow(v[:, :, ::-1])
plt.title(k)
plt.show()
|
![]() ![]() |
◼ 두 개의 이미지를 더하고 블렌딩, 결과를 Matplotlib를 사용하여 서브플롯으로 표시하기
import cv2
import matplotlib.pyplot as plt
import numpy as np
img1 = cv2.imread('./dog.jpg')
img2 = cv2.imread('./square.bmp')
dst1 = cv2.add(img1, img2)
dst2 = cv2.addWeighted(img1,0.5, img2, 0.5, 0)
dst3 = cv2.subtract(img1, img2)
dst4 = cv2.absdiff(img1, img2)
img = {'dst1':dst1, 'dst2':dst2, 'dst3':dst3, 'dsㅅ4':dst4}
for i, (k, v) in enumerate(img.items()):
plt.subplot(2, 2, i+1)
plt.imshow(v[:, :, ::-1])
plt.title(k)
plt.show()
|
![]() |
🔴 컬러 영상과 색
- 컬러 영상은 3차원 배열
- numpy.ndarray
- img.shape: (h, w, 3), opencv에서는 BGR, (높이, 너비, 채널)
◼ 색상 채널 분리, 결합
# 색상 채널 분리
cv2.split(영상)
# 색상 채널 결합
cv2.merge(입력 영상 리스트 또는 튜플)
|
◼ 색상 RGB 분리하기
import cv2
img = cv2.imread('./candies.png')
print('shape: ', img.shape)
print('dtype: ', img.dtype)
'''
b = img[:, :, 0]
g = img[:, :, 1]
r = img[:, :, 2]
'''
b, g, r = cv2.split(img)
cv2.imshow('src', img)
cv2.imshow('b', b)
cv2.imshow('g', g)
cv2.imshow('r', r)
cv2.waitKey()
|
![]() |
🔴 히스토그램 : 영상의 픽셀값 분표를 그래츠 형태로 표현
cv2.calcHist(영상, 채널, None, 빈의 개수를 나타내는 리스트, 히스토그램 각 차원의 최소값으로 구성된 리스트)
|
예) 그레이스케일 영상에서 밝기 정보에 해당하는 픽셀의 개수를 구하고 막대 그래프로 표현 - 어두운 영상이면 히스토그램이 전체적으러 왼쪽으로 치우쳐져 있음 - 명암비가 확실한 영상이면 히스토그램이 양쪽으로 분표해 있음 |
◼ 히스토그램을 계산하고, Matplotlib를 사용하여 그래프로 표시하기
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('./dog.bmp', cv2.IMREAD_GRAYSCALE)
hist = cv2.calcHist([img], [0], None, [256], [0, 255])
cv2.imshow('img', img)
plt.plot(hist)
plt.show()
cv2.waitKey()
|
![]() |
◼ 색상 채널(BGR)의 히스토그램을 하나의 플롯에 그리기
# dog.bmp 영상을 컬러로 불러와 3채널을 계산하여 히스토그램 그리기
# 단, 하나의 plot에서 BGR 그래프를 그리기 (색상을 다르게 표현)
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('./dog.jpg')
colors = ['b', 'g', 'r']
bgr = cv2.split(img)
for (b, c) in zip(bgr, colors):
hist = cv2.calcHist([b], [0], None, [256], [0, 256])
plt.plot(hist, color = c)
cv2.imshow('img', img)
plt.show()
cv2.waitKey()
|
![]() |
'AI > 컴퓨터 비전' 카테고리의 다른 글
06. 이진화 (0) | 2024.07.18 |
---|---|
05. 마스크, 관심영역 (0) | 2024.07.18 |
04. 평활화, 색공간, CLAHE, 정규화 (1) | 2024.07.17 |
02. OpenCV 라이브러리 (3) | 2024.07.16 |
01. 컴퓨터 비전 (3) | 2024.07.16 |