ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Matplotlib] 파이썬 Matplotlib으로 이미지 읽고 그리기
    Python/시각화 2023. 5. 10. 11:11
    반응형

    Matplotlib으로 이미지 읽고 그리기


    파이썬(Python)의 대표적인 시각화 패키지인 맷플롯립(Matplotlib)은 단순히 그래프를 그리는것 이외에도 사진을 표현할 수 있습니다. 이는 파이썬이 사진 데이터를 표현하는 방식 때문인데요, X축과 Y축의 좌표를 이용해서 픽셀의 위치를 확인하고, RGB의 세 가지 요소를 이용해서 색상을 구현하기 때문이지요. 간단히 말해, 파이썬에서 사진은 3차원 array 형태입니다.

     

     

    이러한 이미지 데이터의 특징 덕분에 파이썬에서 기계학습을 하거나, 이미지를 그려야 할 때는 배열 데이터를 표현하거나 입력하는 방식을 이용해서 손쉽게 처리할 수 있습니다. 그리고, 이번에 작업해볼 것은 이미지 데이터를 입맛에 맞게 보여주는 작업이죠. 이번 작업에서는 사이킷런(scikit-learn)에서 제공하는 샘플 이미지를 이용해 보겠습니다.

     

     

    import matplotlib.pyplot as plt
    import numpy as np
    from sklearn.datasets import load_sample_images
    img = load_sample_images()

     

    img
    {'images': [array([[[174, 201, 231],
              [174, 201, 231],
              [174, 201, 231],
              ...,
              [250, 251, 255],
              [250, 251, 255],
              [250, 251, 255]],
    
             [[172, 199, 229],
              [173, 200, 230],
              [173, 200, 230],
              ...,
              [251, 252, 255],
              [251, 252, 255],
              [251, 252, 255]],
    
             [[174, 201, 231],
              [174, 201, 231],
              [174, 201, 231],
              ...,
              [252, 253, 255],
              [252, 253, 255],
              [252, 253, 255]],
    
             ...,
    
             [[ 88,  80,   7],
              [147, 138,  69],
              [122, 116,  38],
              ...,
              [ 39,  42,  33],
              [  8,  14,   2],
              [  6,  12,   0]],
    
             [[122, 112,  41],
              [129, 120,  53],
              [118, 112,  36],
              ...,
              [  9,  12,   3],
              [  9,  15,   3],
              [ 16,  24,   9]],
    
             [[116, 103,  35],
              [104,  93,  31],
              [108, 102,  28],
              ...,
              [ 43,  49,  39],
              [ 13,  21,   6],
              [ 15,  24,   7]]], dtype=uint8),
      array([[[ 2, 19, 13],
              [ 3, 18, 13],
              [ 7, 20, 13],
              ...,
              [ 1, 77, 64],
              [ 0, 76, 64],
              [ 0, 75, 63]],
    
             [[ 1, 18, 12],
              [ 3, 18, 13],
              [ 7, 20, 13],
              ...,
              [ 0, 76, 64],
              [ 1, 74, 65],
              [ 1, 74, 65]],
    
             [[ 2, 17, 12],
              [ 6, 19, 12],
              [ 7, 20, 13],
              ...,
              [ 1, 74, 65],
              [ 1, 74, 67],
              [ 1, 74, 67]],
    
             ...,
    
             [[ 0, 46, 40],
              [ 1, 48, 40],
              [ 1, 47, 37],
              ...,
              [ 5, 44, 26],
              [ 6, 43, 26],
              [ 7, 44, 27]],
    
             [[ 0, 47, 41],
              [ 1, 48, 40],
              [ 1, 47, 37],
              ...,
              [ 6, 45, 27],
              [ 7, 44, 27],
              [ 7, 44, 27]],
    
             [[ 0, 47, 41],
              [ 1, 48, 40],
              [ 0, 46, 36],
              ...,
              [ 7, 46, 28],
              [ 8, 45, 28],
              [ 9, 43, 27]]], dtype=uint8)],
     'filenames': ['china.jpg', 'flower.jpg'],
     'DESCR': 'Image: china.jpg\nReleased under a creative commons license. [1]\nAttribution: Some rights reserved by danielbuechele [2]\nRetrieved 21st August, 2011 from [3] by Robert Layton\n\n[1] https://creativecommons.org/licenses/by/2.0/\n[2] https://www.flickr.com/photos/danielbuechele/\n[3] https://www.flickr.com/photos/danielbuechele/6061409035/sizes/z/in/photostream/\n\n\nImage: flower.jpg\nReleased under a creative commons license. [1]\nAttribution: Some rights reserved by danielbuechele [2]\nRetrieved 21st August, 2011 from [3] by Robert Layton\n\n[1] https://creativecommons.org/licenses/by/2.0/\n[2] https://www.flickr.com/photos/vultilion/\n[3] https://www.flickr.com/photos/vultilion/6056698931/sizes/z/in/photostream/\n\n\n\n'}

     

     

    이렇게 보면 아시겠지만, 이번에 불러온 데이터인 img 는 3차원 배열이 들어가 있는 리스트의 형태를 하는 images 부분과 파일 이름이 적힌 filenames 부분, 그리고 자료 출처가 적힌 DESCR 부분으로 구성된 Bunch 자료형입니다.

     

     

    그리고, 각각의 이미지는 해당 이미지의 크기에 따라 배열 크기가 정해져 있는데요, 아래 코드를 이용해서 확인해 본다면, 427*640px 크기에 RGB 색상 공간을 가진 이미지라는 것을 확인할 수 있습니다.

     

     

    img.images[0].shape
    (427, 640, 3)

     

     

    이 이미지를 보여주는 출력 코드는 생각보다 간단합니다. matplotlib에서는 imshow 라는 함수가 존재하는데, 이를 이용하면 이미지 정보를 가지고 있는 배열을 별다른 처리 없이 우리가 익숙한 형태로 출력해 주기 때문입니다. 아래에는 두 장의 이미지를 가로 배열로 출력하는 코드를 써 봤습니다.

     

     

    fig, axes = plt.subplots(1, 2, figsize = (10,10))
    
    for n,ax in enumerate(np.ravel(axes)):
        ax.imshow(img.images[n])
        ax.axis('off') # 축 정보 숨기기
    
    plt.show()

     

     

    그리고, 만약 이미지를 편집하는 등의 변화가 생겨서 파일로 저장하고 싶다면 savefig 함수를 이용해서 저장할 수 있습니다. 다만, savefig 함수와 show 함수를 같이 사용할 때는 항상 savefig 함수를 먼저 써 주시는 것을 잊지 마세요. show 함수는 파이썬에서 print 함수와 같이 출력으로 처리해 버리기 때문에, 출력 이후에는 다른 함수에서 이미지 정보를 받아올 수 없기 때문입니다.

     

     

    fig, axes = plt.subplots(1, 2, figsize = (10,10))
    
    for n,ax in enumerate(np.ravel(axes)):
        ax.imshow(img.images[n])
        ax.axis('off') # 축 정보 숨기기
    
    plt.savefig('new_image.png')
    plt.show()

    반응형

    댓글

문의: jwkang3929@naver.com