본문 바로가기

OpenCV

OpenCV를 사용하여 이미지 읽기, 표시 및 쓰기 - 시리즈

반응형

 

OpenCV를 사용하여 이미지 읽기, 표시 및 쓰기

 

이미지를 읽고, 표시하고, 쓰는 것은 이미지 처리와 컴퓨터 비전의 기본입니다. 이미지를 자르거나, 크기를 조정하거나, 회전하거나, 다양한 필터를 적용하여 처리할 때에도 먼저 이미지를 읽어들여야 합니다. 따라서 이러한 기본 작업을 숙달하는 것이 중요합니다.

 

세계 최대의 컴퓨터 비전 라이브러리인 OpenCV에는 다음과 같은 세 가지 내장 함수가 있습니다. 각 함수가 정확히 무엇을 하는지 알아보겠습니다.

 

  • imread()이미지를 읽는 데 도움이 됩니다
  • imshow()창에 이미지를 표시합니다
  • imwrite()파일 디렉토리에 이미지를 씁니다

 

 

 

시스템에 이미 OpenCV가 설치되어 있다고 가정합니다. OpenCV를 설치해야 하는 경우 아래 관련 링크를 방문하세요.

 

Windows에 OpenCV 설치

MacOS에 OpenCV 설치

Ubuntu에 OpenCV 설치

 

다음 이미지를 사용하여 여기의 모든 기능을 보여드리겠습니다.

 

전경에는 눈이 덮인 장미꽃이 있고, 갈색 배경이 있는 이미지입니다. 이 게시물 전체에서 동일한 이미지를 사용하여 이미지를 읽고, 표시하고, 쓰는 방법을 보여드리겠습니다.

 

 

이 블로그 전체에서 사용할 입력 이미지의 예입니다.

 

먼저, 이 코드 예제를 살펴보겠습니다. 위 이미지를 읽고 표시합니다. 방금 언급한 세 가지 함수가 모두 어떻게 포함되어 있는지 확인해 보세요. 앞으로 이 구현에 사용된 모든 함수를 하나하나 살펴보겠습니다.

 

파이썬

 

# import the cv2 library
import cv2
 
# The function cv2.imread() is used to read an image.
img_grayscale = cv2.imread('test.jpg',0)
 
# The function cv2.imshow() is used to display an image in a window.
cv2.imshow('graycsale image',img_grayscale)
 
# waitKey() waits for a key press to close the window and 0 specifies indefinite loop
cv2.waitKey(0)
 
# cv2.destroyAllWindows() simply destroys all the windows we created.
cv2.destroyAllWindows()
 
# The function cv2.imwrite() is used to write an image.
cv2.imwrite('grayscale.jpg',img_grayscale)

 

C++

 

//Include Libraries
#include<opencv2/opencv.hpp>
#include<iostream>
 
// Namespace nullifies the use of cv::function(); 
using namespace std;
using namespace cv;
 
// Read an image 
Mat img_grayscale = imread("test.jpg", 0);
 
// Display the image.
imshow("grayscale image", img_grayscale); 
 
// Wait for a keystroke.   
waitKey(0);  
 
// Destroys all the windows created                         
destroyAllWindows();
 
// Write the image in the same directory
imwrite("grayscale.jpg", img_grayscale);

 

먼저, Python과 C++로 OpenCV 라이브러리를 가져오는 것부터 시작해 보겠습니다(아래 참조).

 

# import the cv2 library

import cv2

 

C++에서는 #include(아래와 같이)를 사용하여 동일한 작업을 수행할 수 있습니다. 또한 네임스페이스를 지정하면 함수 이름을 직접 참조할 수 있습니다. 네임스페이스를 앞에 붙일 필요가 없습니다(예 cv::imread(): 대신 를 직접 사용할 수 있습니다 read()).

 

C++:

 

//Include Libraries
#include<opencv2/opencv.hpp>
#include<iostream>
 
// Namespace nullifies the use of cv::function(); 
using namespace std;
using namespace cv;

 

 

이미지 읽기

 

이미지를 읽으려면 imread() OpenCV의 함수를 사용하세요. 구문은 다음과 같습니다.

 

imread(filename, flags)

 

두 가지 인수가 필요합니다.

 

  1. 첫 번째 인수는 이미지 이름으로, 파일에 대한 완전한 경로 이름이 필요합니다.
  2. 두 번째 인수는 이미지 표현 방식을 지정할 수 있는 선택적 플래그입니다. OpenCV는 이 플래그에 대해 여러 옵션을 제공하지만, 가장 일반적인 옵션은 다음과 같습니다.

 

  • cv2.IMREAD_UNCHANGED 또는-1
  • cv2.IMREAD_GRAYSCALE 또는0
  • cv2.IMREAD_COLOR 또는1

 

플래그의 기본값은 1이며, 이 경우 이미지를 컬러 이미지로 읽습니다. 특정 형식으로 이미지를 읽으려면 해당 플래그를 지정하기만 하면 됩니다. 다양한 플래그 옵션을 확인하려면 여기를 클릭하세요.

 

OpenCV는 BGR 형식으로 컬러 이미지를 읽는 반면, 대부분의 다른 컴퓨터 비전 라이브러리는 RGB 채널 형식 순서를 사용한다는 점에 유의해야 합니다 . 따라서 OpenCV를 다른 툴킷과 함께 사용할 때는 라이브러리를 전환할 때 파란색과 빨간색 채널의 위치를 ​​바꾸는 것을 잊지 마세요.

 

아래 코드 섹션에서 볼 수 있듯이, 위에서 설명한 세 가지 플래그 값을 모두 사용하여 먼저 테스트 이미지를 읽습니다.

 

파이썬

 

# Read an image
img_color = cv2.imread('test.jpg',cv2.IMREAD_COLOR)
img_grayscale = cv2.imread('test.jpg',cv2.IMREAD_GRAYSCALE)
img_unchanged = cv2.imread('test.jpg',cv2.IMREAD_UNCHANGED)

 

C++

 

// Read an image 
Mat img_color = imread("test.jpg", IMREAD_COLOR);
Mat img_grayscale = imread("test.jpg", IMREAD_GRAYSCALE);
Mat img_unchanged = imread("test.jpg", IMREAD_UNCHANGED);

 

또는

 

파이썬

 

img_color = cv2.imread('test.jpg',1)
img_grayscale = cv2.imread('test.jpg',0)
img_unchanged = cv2.imread('test.jpg',-1)

 

 

C++

 

Mat img_color = imread("test.jpg", 1);
Mat img_grayscale = imread("test.jpg", 0);
Mat img_unchanged = imread("test.jpg", -1);

 

 

이미지 표시

 

OpenCV에서는 imshow()함수를 사용하여 이미지를 표시합니다. 구문은 다음과 같습니다.

 

imshow(window_name, image)

 

이 함수는 또한 두 개의 인수를 사용합니다.

  1. 첫 번째 인수는 창에 표시될 창 이름입니다.
  2. 두 번째 인수는 표시하려는 이미지입니다.

 

여러 이미지를 한 번에 표시하려면 표시하려는 각 이미지에 대해 새 창 이름을 지정하세요.

 

이 기능은 및 / 기능 imshow()과 함께 사용하도록 설계되었습니다.

 

.waitKey()destroyAllWindows()destroyWindow()

 

해당 waitKey()기능은 키보드 바인딩 기능입니다.

  • 이 함수는 창이 표시되는 시간(밀리초)을 나타내는 단일 인수를 사용합니다.
  • 사용자가 이 시간 내에 아무 키나 누르면 프로그램이 계속 진행됩니다.
  • 0이 전달되면 프로그램은 키 입력을 무기한 기다립니다.
  • 키보드의 Q 키나 ESC 키와 같이 특정 키 입력을 감지하도록 기능을 설정하면 어떤 키가 어떤 동작을 트리거하는지 더욱 명확하게 알 수 있습니다.

 

이 함수는 destroyAllWindows()생성된 모든 창을 삭제합니다. 특정 창을 삭제해야 하는 경우, 해당 창의 이름을 인수로 지정하세요. 이 함수를 사용하면 destroyAllWindows()시스템의 주 메모리에서도 창이나 이미지가 삭제됩니다. 아래 코드 예제는 이 imshow()함수를 사용하여 읽어온 이미지를 표시하는 방법을 보여줍니다.

 

파이썬

 

#Displays image inside a window
cv2.imshow('color image',img_color)  
cv2.imshow('grayscale image',img_grayscale)
cv2.imshow('unchanged image',img_unchanged)
 
# Waits for a keystroke
cv2.waitKey(0)  
 
# Destroys all the windows created
cv2.destroyAllwindows()

 

C++

 

// Create a window.
namedWindow( "color image", WINDOW_AUTOSIZE );
namedWindow( "grayscale image", WINDOW_AUTOSIZE );
namedWindow( "unchanged image", WINDOW_AUTOSIZE );
 
// Show the image inside it.
imshow( "color image", img_color ); 
imshow( "grayscale image", img_grayscale );
imshow( "unchanged image", img_unchanged ); 
 
// Wait for a keystroke.   
waitKey(0);  
 
// Destroys all the windows created                         
destroyAllWindows();

 

 

아래는 코드 실행, 출력 시각화, 출력 창 닫기 과정을 보여주는 GIF입니다.

 

 

아래에 표시된 세 개의 출력 화면에서 다음을 확인할 수 있습니다.

 

  1. 첫 번째 이미지는 컬러로 표시됩니다.
  2. 다음은 회색조로
  3. 세 번째는 원래 이미지 형식이었기 때문에 다시 컬러로 표시됩니다. (이미지는 를 사용하여 읽었습니다 cv2.IMREAD_UNCHANGED.)

 

imshow() 함수의 출력입니다. 코드에 지정된 옵션에 따라 컬러 이미지가 표시됩니다.

 

 

함수를 사용하여 이미지를 컬러로 표시합니다 imshow().

 

imshow() 함수의 출력입니다. 코드에 지정된 옵션에 따라 회색조 이미지가 표시됩니다.

 

 

함수를 사용하여 이미지를 회색조로 표시합니다 imshow().

 

imshow() 함수의 출력입니다. 코드에 지정된 옵션에 따라 변경되지 않은 이미지가 표시됩니다.

 

 

해당 함수를 사용하여 변경되지 않은 이미지를 표시합니다 imshow().

 

아래 GIF는 이미지를 읽고 표시하는 코드의 실행 과정을 보여줍니다. 하지만 . 없이 실행됩니다 waitKey(). 창은 밀리초 이내에 사라지고 화면에는 아무런 출력도 표시되지 않습니다.

 

 

 

이미지 쓰기

 

마지막으로, 함수를 사용하여 파일 디렉터리에 이미지를 쓰고 저장하는 방법을 살펴보겠습니다 imwrite(). 구문은 다음과 같습니다.

 

imwrite(filename, image).

 

  1. 첫 번째 인수는 파일 이름이며, 파일 이름 확장자(예: .png, .jpg 등)를 포함해야 합니다. OpenCV는 이 파일 이름 확장자를 사용하여 파일 형식을 지정합니다.
  2. 두 번째 인수는 저장할 이미지입니다. True이미지가 성공적으로 저장되면 함수가 반환합니다.

 

아래 코드를 살펴보세요. 디스크에 이미지를 쓰는 것이 얼마나 간단한지 확인해 보세요. 파일 이름과 적절한 확장자(원하는 경로 추가)만 지정하면 됩니다. 이미지 데이터가 포함된 변수 이름을 포함시키면 됩니다.

 

파이썬

 

cv2.imwrite('grayscale.jpg',img_grayscale)

 

C++

 

imwrite("grayscale.jpg", img_grayscale);

 

요약

 

여기에서는 다음을 사용하는 방법을 배웠습니다.

 

  • imread(), 이미지를 읽고, 표시하고, 쓰는 imshow()기능imwrite()
  • waitKey()및 destroyAllWindows()디스플레이 기능과 함께 기능
  • 키를 누르면 이미지 창을 닫습니다
  • 메모리에서 열려 있는 모든 이미지 창을 지웁니다.

 

이 함수는 꽤 복잡할 수 있으므로 여러 번 실험해 봐야 합니다 waitkey(). 익숙해질수록 더 잘 활용할 수 있습니다. 전체 코드를 다운로드하여 직접 경험해 보세요. OpenCV 라이브러리를 배우고 마스터하는 데 실제로 도움이 되는 기본 구성 요소이므로 충분히 연습해 보세요. → OpenCV 콜랩 노트북

 

 

튜토리얼 번역 원문 링크

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^