본문 바로가기
CV(Computer Vision)

영상처리 기초 : 화소처리

by 코낄2 2024. 2. 10.

1. 화소처리

영상의 화소 처리란 영상의 특정 좌표 픽셀값을 변경하여 출력 영상의 좌표 픽셀을 설정하는 모든 연산을 의미합니다.

(1) 밝기 조절

영상의 밝기를 조절하는 연산은 전체적으로 영상을 밝게하거나 어둡게 하는데 사용됩니다.

cv2.add(첫번째 영상, 두번째 영상)  #픽셀값이 높아지면 밝아짐, 꼭 영상끼리가 아니고 상수값도 가능
cv2.subtract(첫번째 영상, 두번째 영상) # 어두워짐.
cv2.multiply(첫번째 영상, 두번째 영상)
cv2.divide(첫번째 영상, 두번째 영상)
src1 = cv2.imread('./dog.bmp', cv2.IMREAD_GRAYSCALE)
src2 = cv2.imread('./dog.bmp')

dst1 = cv2.add(src1, 100)
dst2 = cv2.add(src2, (100,100,100,0))
dst3 = cv2.subtract(src1, 100)
dst4 = cv2.multiply(src1, (10))
dst5 = cv2.divide(src1, (10))


cv2.imshow('scr1', src1)
cv2.imshow('scr2', src2)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
cv2.imshow('dst3', dst3)
cv2.imshow('dst4', dst4)
cv2.imshow('dst5', dst5)

cv2.waitKey()

src1 = cv2.imread('./man.jpg')
src2 = cv2.imread('./turkey.jpg')

# src1 + src2 : 값이 255를 넘어가면 해당 값에서 256를 빼서 표현
# cv2.add(src1,src2) : 값이 255를 넘어가면 255로 고정
dst1 = src1 + src2
dst2 = cv2.add(src1,src2)

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

(2) 가중치 합 (Weighted Sum)

두 영상의 같은 위치에 존재하는 픽셀값에 대하여 가중합을 계산해서 결과 영상의 픽셀값으로 설정합니다.

cv2.addWeighted(첫번째 영상, 알파값, 두번째 영상, 1-알파값, 감마값)
  • 알파값: 첫번째 영상에 지정할 가중치. 가중치의 합은 1이 됨
  • 감마값: 연산 결과에 가감할 상수. 기본값은 0
src1 = cv2.imread('./man.jpg')
src2 = cv2.imread('./turkey.jpg')

alpha = 0.7

# 직접 계산해보기
dst1 = src1 * alpha + src2 * (1-alpha)
dst1 = dst1.astype(np.uint8)

dst2 = cv2.addWeighted(src1, alpha, src2, (1-alpha), 0)

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

(3) 두 영상의 차이 (Absolute Difference)

두 영상의 픽셀 값을 빼면 음수가 나올 수 있는데, 해당 값에 절대값을 취한 값입니다.

cv2.absdiff(첫번째 영상, 두번째 영상) # 100 - 200 = 100
src1 = cv2.imread('./dog.jpg')
src2 = cv2.imread('./square.bmp')

alpha = 0.5

dst1 = cv2.add(src1, src2)
dst2 = cv2.addWeighted(src1, alpha, src2, (1-alpha), 0)
dst3 = cv2.subtract(src1, src2)
dst4 = cv2.absdiff(src1, src2)

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

for i, (k,v) in enumerate(img.items()):
    plt.subplot(2,2, i+1)
    plt.subplots_adjust(wspace=0.5, hspace=0.5)  # 서브 플롯 간의 간격 조정
    plt.imshow(v[:,:,::-1])
    plt.title(k)
plt.show()

원본
dst4는 뺸값에 절대값을 씌워서 컬러값이 반전이 되었습니다.

 

2. 컬러 영상과 색상

컬러 영상은 RGB 색상 공간에서 각 픽셀의 색상을 나타내기 위해 3차원 배열로 표현됩니다. OpenCV에서는 컬러 영상을 BGR 순서로 표현합니다.

(1) 색상 채널 분리

컬러 영상의 각 색상 채널을 분리하려면 cv2.split() 함수를 사용합니다. 이 함수는 입력된 컬러 영상을 각 색상 채널로 분리하여 리스트로 반환합니다.

src = cv2.imread('./candies.png') #BGR
print('shape',src.shape) // shape (480, 640, 3)
print('dtype',src.dtype) // dtype uint8

# split 함수 없이 직접 찍어보기
b = src[:, :, 0]
g = src[:, :, 1]
r = src[:, :, 2]

b, g, r = cv2.split(src)

cv2.imshow('src', src)
cv2.imshow('b', b)
cv2.imshow('g', g)
cv2.imshow('r', r)
cv2.waitKey()

3. 히스토그램 (Histogram)

히스토그램은 영상의 픽셀값 분포를 그래프 형태로 표현한 것입니다. 히스토그램을 통해 영상의 밝기, 색상 등에 대한 정보를 시각적으로 파악할 수 있습니다.

(1) 히스토그램 계산

영상의 히스토그램을 계산하기 위해서는 cv2.calcHist() 함수를 사용합니다. 이 함수는 입력된 영상으로부터 히스토그램을 계산하고 반환합니다.

cv2.calcHist(영상, 히스토그램을 구할 채널, None, 빈의 개수를 나타내는 리스트[256],
             히스토그램 각 차원의 최소값과 최대값으로 구성된 리스트[0, 255])
src = cv2.imread('./dog.bmp', cv2.IMREAD_GRAYSCALE)

hist = cv2.calcHist([src], [0], None, [256], [0,255])
cv2.imshow('src', src)
plt.plot(hist)
plt.show()
cv2.waitKey()

# dog.bmp 이미지를 사용하여 3채널(RGB)로 계산해 히스토그램 그리기
# 단, 하나의 plot에서 RGB 그래프를 그리기

import cv2
import matplotlib.pyplot as plt

src = cv2.imread('./dog.bmp')

# histB = cv2.calcHist([src], [0], None, [256], [0,256])
# histG = cv2.calcHist([src], [1], None, [256], [0,256])
# histR = cv2.calcHist([src], [2], None, [256], [0,256])

colors = ['b', 'g', 'r']
bgr =cv2.split(src)

for (b, c) in zip(bgr, colors):
    hist = cv2.calcHist([b], [0], None, [256], [0,255])
    plt.plot(hist, color = c)

cv2.imshow('src', src)
plt.show()
cv2.waitKey()

 

'CV(Computer Vision)' 카테고리의 다른 글

영상의 변환/ 적응형 이진화/ 유사도  (0) 2024.02.25
관심 영역/ 이진화  (0) 2024.02.18
이미지 처리 기법  (0) 2024.02.16
동영상 처리  (0) 2024.02.09
컴퓨터 비전과 OpenCV  (1) 2024.02.09