Python OpenCV - 3. 이미지 출력

정재욱·2023년 2월 1일
0

OpenCV

목록 보기
2/2
post-thumbnail

Python OpenCV - 3. 이미지 읽고 저장하기

OpenCV는 래스터 그래픽스 이미지 파일 포맷을 쉽게 불러올 수 있는 별도의 함수를 제공한다.

이 함수는 불러온 압축 해제된 이미지 데이터 구조에 필요한 메모리 할당과 같은 복잡한 작업을 처리하며, 파일 시그니처(File Signature)를 읽어 적절한 코덱을 결정한다.

OpenCV에서 이미지를 불러올 때는 확장자를 확인하는 방식이 아닌 파일 시그니처를 읽어 파일의 포맷을 분석하는 방식을 사용한다.

파일 시그니처는 파일 매직 넘버(File Magic Number)라고도 하며, 각 파일 형식마다 몇 개의 바이트가 지정되어 있다.

예를 들어, PNG 확장자의 경우 89 50 4E 47 … 형태로 파일 헤더에 포함되어 있다.

이미지 입력 함수는 운영체제의 코덱을 사용해 운영체제 별로 픽셀값이 다를 수 있다.

이미지 읽기

메인코드

import cv2

image1 = cv2.imread("Image/lunar.jpg", cv2.IMREAD_ANYCOLOR)
if image1 is not None:
    cv2.imshow("IMG", image1)
    cv2.waitKey()
    cv2.destroyAllWindows()
else:
    print("No image file.")

image2 = cv2.imread("Image/lunar.jpg", cv2.IMREAD_GRAYSCALE)
if image2 is not None:
    cv2.imshow("IMG", image2)
    cv2.waitKey()
    cv2.destroyAllWindows()
else:
    print("No image file.")

세부코드

image1 = cv2.imread("Image/lunar.jpg", cv2.IMREAD_ANYCOLOR)

이미지 입력 함수(cv2.imread)를 통해 로컬 경로의 이미지 파일을 읽어올 수 있다.

image = cv2.imread(fileName, flags)는 파일 경로(fileName)의 이미지 파일을 플래그(flags) 설정에 따라 불러온다.

파일 경로(fileName)는 상대 경로 또는 절대 경로를 사용하여 이미지를 불러온다.

flags은 이미지를 초기에 불러올 때 적용할 초기 상태를 의미한다.

  • flags
    - cv2.IMREAD_UNCHANGED : 원본 사용
    - cv2.IMREAD_GRAYSCALE : 1 채널, 그레이스케일 적용
    - cv2.IMREAD_COLOR : 3 채널, BGR 이미지 사용
    - cv2.IMREAD_ANYDEPTH : 이미지에 따라 정밀도를 16/32비트 또는 8비트로 사용
    - cv2.IMREAD_ANYCOLOR : 가능한 3 채널, 색상 이미지로 사용
    - cv2.IMREAD_REDUCED_GRAYSCALE_2 : 1 채널, 1/2 크기, 그레이스케일 적용
    - cv2.IMREAD_REDUCED_GRAYSCALE_4 : 1 채널, 1/4 크기, 그레이스케일 적용
    - cv2.IMREAD_REDUCED_GRAYSCALE_8 : 1 채널, 1/8 크기, 그레이스케일 적용
    - cv2.IMREAD_REDUCED_COLOR_2 : 3 채널, 1/2 크기, BGR 이미지 사용
    - cv2.IMREAD_REDUCED_COLOR_4 : 3 채널, 1/4 크기, BGR 이미지 사용
    - cv2.IMREAD_REDUCED_COLOR_8 : 3 채널, 1/8 크기, BGR 이미지 사용

if image1 is not None:
    cv2.imshow("IMG", image1)
    cv2.waitKey()
    cv2.destroyAllWindows()
else:
    print("No image file.")

이미지 표시 함수(cv2.imshow)와 키 입력 대기 함수(cv2.waitkey)로 윈도우 창에 이미지를 띄울 수 있다.

키 입력 대기 함수를 사용하지 않을 경우, 윈도우 창이 유지되지 않고 프로그램이 종료된다.

키 입력 이후, 모든 윈도우 창 제거 함수(cv2.destroyAllWindows)를 이용하여 모든 윈도우 창을 닫는다.


출력 결과

추가정보

height, width channel = image.shape
print(height, width , channel)

결과

1920 1280 3

height, width , channel = image.shape를 이용하여 해당 이미지의 높이너비채널의 값을 확인할 수 있다.

이미지의 속성은 크기정밀도채널을 주요한 속성으로 사용한다.

  • 크기 : 이미지의 높이와 너비를 의미.
  • 정밀도 : 이미지의 처리 결과의 정밀성을 의미.
  • 채널 : 이미지의 색상 정보를 의미.
  • Tip : 유효 비트가 많을 수록 더 정밀해진다.
  • Tip : 채널이 3일 경우, 다색 이미지이다. 채널이 1일 경우, 단색 이미지이다.

이미지 저장하기

import cv2

image = cv2.imread("Image/lunar.jpg", cv2.IMREAD_GRAYSCALE)
if image is not None:
    cv2.imshow("IMG", image2)
    cv2.imwrite("Image/lunar_gray.jpg", image)
    cv2.waitKey()
    cv2.destroyAllWindows()
else:
    print("No image file.")

위 코드에서 cv2.imread() 함수를 호출하면 읽은 사진 파일이 image라는 변수에 담깁니다. cv2.imwrite() 함수를 호출하면 image 변수에 담긴 사진 파일을 자신의 PC에 저장할 수 있습니다. 즉, 원본 컬러 파일인 lunar.jpg를 읽어 회색으로 변경한 뒤 lunar_gray.jpg로 저장하는 코드입니다.


참고 : Daehee YUN Tech Blog

profile
AI 서비스 엔지니어를 목표로 공부하고 있습니다.

0개의 댓글