Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 영상의 속성과 픽셀 값 참조

AI 꿈나무 2020. 9. 25. 13:56
반응형

영상의 속성과 픽셀 값 참조

 OpenCV는 영상 데이터를 numpy.ndarray로 표현합니다.

 

 영상의 속성을 참조하는 명령어는 다음과 같습니다.

  .ndim : 차원 수, len(img.shape)와 같음

  .shape : 각 차원의 크기, 흑백(h,w), 컬러(h,w,3), png(h,w,4)

  .size : 전체 원소 개수

  .dtype : 원소의 데이터 타입. 영상 데이터는 unit8

 

(1) OpecCV 영상 데이터 자료형과 NumPy 자료형

 추후에 OpenCV 자료형으로 입력값을 넣어줘야 하는 경우가 있으므로 기억해 둡시다.

 

(2) 영상의 속성 참조 예제

 영상의 속성을 확인하는 코드를 보겠습니다.

import sys
import cv2


# 영상 불러오기
img1 = cv2.imread('cat.bmp', cv2.IMREAD_GRAYSCALE) # 그레이스케일
img2 = cv2.imread('cat.bmp', cv2.IMREAD_COLOR)     # 컬러


# 불러왔는지 확인
if img1 is None or img2 is None:
    print('Image load failed!')
    sys.exit()
    
    
# 영상의 속성 참조
print('type(img1):', type(img1)) # img1의 타입 확인 <class 'numpy.ndarray>
print('img1.shape:', img1.shape) # 각 차원의 크기 (480, 640) h,w 순서
print('img2.shape:', img2.shape) # 각 차원의 크기 (480, 640, 3), h,w,컬러 순서 png파일은 3 -> 4
print('img1.dtype:', img1.dtype) # 원소의 데이터 타입. 영상 데이터는 unit8


# 영상의 크기 참조
h, w = img2.shape[:2] # 슬라이싱이므로 2-1 -> 0,1   2개만 갖고 옴
print('img2 size: {} x {}'.format(w, h)) # h : 480, w : 640

# 영상 출력
cv2.imshow('img1', img1) # 윈도우창을 생성하지 않아도 자동으로 생성
cv2.imshow('img2', img2)
cv2.moveWindow('img2', 400, 200) # 'img1', 'img2'가 겹치기 때문에 이동
cv2.waitKey()

 

(3) 영상의 픽셀 값 참조

img1 = cv2.imread('cat.bmp', cv2.IMREAD_GRAYSCALE) # 그레이스케일
img2 = cv2.imread('cat.bmp', cv2.IMREAD_COLOR)     # 컬러


# for문을 이용한 영상의 픽셀 값 수정
# 매우 느려서 절대 이용하면 안됌, OpenCV or Numpy에서 제공하는 함수 이용하기.
for y in range(h):
    for x in range(w):
        # y, x 순서인 이유 : 영상 행렬은 높이, 길이로 저장되므로
        img1[y, x] = 255 # BGR 모두 255 => 하양색
        img2[y, x] = (0, 0, 255) # x,y 위치의 픽셀을 (0, 0, 255) 빨강색으로 만듬
        

# 슬라이싱을 이용한 영상의 픽셀 값 수정
img1[:,:] = 255         # 모든 픽셀을 흰색
img2[:,:] = (0, 0, 255) # 모든 픽샐을 빨강색


# 영상 출력
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.waitKey()


# 윈도우 창 닫기
cv2.destroyAllWindows()

 

 코드에서 img2(컬러 영상)의 모든 픽셀을 빨강색으로 바꿔주었습니다.

 결과를 출력해보도록 해보겠습니다.

 

 

 

 고양이 사진의 모든 픽셀이 빨강색으로 변경되었습니다.

 

반응형