공부하는 아저씨의 IT 공방

파이썬 시각화 공부 2일(픽셀연산) 본문

파이썬 기초(1일 1코드)

파이썬 시각화 공부 2일(픽셀연산)

공대아저씨 2023. 9. 5. 23:07

안녕하세요 공대아저씨입니다. 지난 시간에는 CV의 기초인 이미지 그레이스케일 변환과 matplotlib을 활용하는 법에 대해서 공부하였습니다. 이번시간에는 픽셀연산에 대해서 한번 공부를 해볼까 합니다. 

 

먼저, Computer-vision에서 픽셀연산이 중요한 이유는 여러가지가 있습니다. 그 중에서도 CV에서 다루는 이미지와 영상 데이터를 효과적으로 처리하고 해석하기 위해서는 픽셀연산은 굉장히 핵심적인 역할을 수행 한다고 할 수 있습니다.

 

즉, 픽셀연산으로 이미지 처리와 분석을 위해서 픽셀연산을 통해 특징을 추출하거나, 필터링을 개선, 객체 인식과 분할 등 다양한 곳에 활용됩니다.

 

그래서 오늘은 이렇게 중요한 픽셀연산을 이전에 1일차에서 수행했던 이미지를 기준으로 한번 진행해보겠습니다.

 

먼저 open CV를 import 하겠습니다.(open cv는 영상데이터를 numpy.ndarray로 표현합니다.)

 

import cv2

img1 = cv2.imread('./img/faceFront1.jpeg', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('./img/faceFront1.jpeg', cv2.IMREAD_COLOR)

cv2.imshow('img1', img1)
cv2.imshow('img2', img2)

cv2.waitKey()
cv2.destroyAllWindows()
print('img1:', type(img1), '\t img2:', type(img2)) # 사진의 타입 확인, \t -> 탭(띄어쓰기)
print('img1:', img1.shape, '\t img2:', img2.shape) # 사진의 크기 확인
print('img1[50][50]:', img1[50][50], '\t img2[50][50]:', img2[50][50])

자 여기까지 진행하면 다음과 같은 결과가 도출됩니다.

img1: <class 'numpy.ndarray'> 	 img2: <class 'numpy.ndarray'>
img1: (251, 201) 	 img2: (251, 201, 3)
img1[50][50]: 176 	 img2[50][50]: [148 169 200]

 

특정좌표의 컬러값 변경

import cv2

img1 = cv2.imread('./img/4.jpg', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('./img/4.jpg', cv2.IMREAD_COLOR)

x = 10 #좌표값
y = 20
img1[y,x] = 0
img2[y,x] = (255, 0, 0) #특정좌표 검정색으로

cv2.imshow('img1', img1)
cv2.imshow('img2', img2)

cv2.waitKey()
cv2.destroyAllWindows()

이렇게되면 특정 좌표의 색상이 검정색으로 변경되게 됩니다.

 

# 특정좌표의 컬러값 변경

import cv2

img1 = cv2.imread('./img/4.jpg', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('./img/4.jpg', cv2.IMREAD_COLOR)

# x,y 전체를 바꾸기
img1[:,:] = 0
img2[:,:] = (0, 0, 255) #특정좌표 검정색으로

cv2.imshow('img1', img1)
cv2.imshow('img2', img2)

cv2.waitKey()
cv2.destroyAllWindows()

이번에는 x, y 전체를 검정색으로 변경해보았습니다.

 

# 특정좌표의 컬러값 변경

import cv2

img1 = cv2.imread('./img/4.jpg', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('./img/4.jpg', cv2.IMREAD_COLOR)

# x,y 구간 좌표를 바꾸기
img1[10:20,10:20] = 0
img2[10:20,10:20] = (0, 0, 255) #특정좌표 검정색으로

cv2.imshow('img1', img1)
cv2.imshow('img2', img2)

cv2.waitKey()
cv2.destroyAllWindows()

이번에는 구간 좌표를 바꾸어 보았습니다.

 

import numpy as np
import cv2

img1 = np.empty((240,320), dtype=np.uint8)  # 비어있는 크기가 240 320인 매트릭스를 만들어줘라
cv2.imshow('img1', img1)
print('img1', img1[50][:10]) #50번째 줄에 처음부터 10번째 까지


img2 = np.zeros((240,320, 3), dtype=np.uint8) 
cv2.imshow('img2', img2)
print('img2', img2[50][:10])


img3 = np.zeros((240,320), dtype=np.uint8) * 255
cv2.imshow('img3', img3)
print('img3', img3[50][:10])


# 특정한 값으로 채우기
img4 = np.full((240,320,3),(15, 127, 255), dtype=np.uint8) * 255
cv2.imshow('img4', img4)
print('img4', img4[50][:10])


cv2.waitKey()
cv2.destroyAllWindows()

img1 - 빈 이미지 행렬(흑백이미지)

img2 - 크기가 (240, 320, 3)인 모든 픽셀 값이 0인 검은색 이미지

img3 - 픽셀값이 255인 흰색이미지

img4 - 픽셀값이 (15, 127, 255)인 컬러 이미지 생성(B,G,R)

 

따라해보기.  크기가 320x240이고 검은색 바탕에 크기가 50x50인 붉은색 상자를 그리기

import numpy as np
import cv2

img1 = np.full((240,320, 3),(0, 0, 0), dtype=np.uint8)*255  # 크기가 320x240이고 검은색 바탕
img1[45:195, 85:235] = (0, 0, 255) #중심점 기준 좌우 75 특정좌표 검정색으로
img1[95:145, 135:185] = (255, 0, 0) #중심점 기준 좌우 25
cv2.imshow('img1', img1)
# 순서대로 입력되기때문에 덮어씌워짐

cv2.waitKey()
cv2.destroyAllWindows()

 

오늘은 CV의 기초인 픽셀연산에 대해서 한번 공부해보았습니다. 픽셀연산에서의 핵심은 내가 원하는 지점의 좌표를 명확하게 알고 그 좌표가 갖는 값을 내가 원하는대로 바꾸는 것입니다.

 

다음시간에는 파이썬 코드를 이용해 라인, 도형 그리기와 비디오 캡쳐기능 사용하기에 대해 한번 알아보겠습니다.

 

감사합니다. :)