[Python] 이미지 데이터 입출력

Page content

1줄 요약

  • OpenCV를 활용한 다양한 이미지 입출력에 대해 배우도록 한다.

Reading/Writing an image file

  • 이미지 관련 I/O
  • BMP, PNG, JPEG, and TIFF also supported.
import numpy as np
img = np.zeros((3, 3), dtype=np.uint8)
img
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]], dtype=uint8)
  • 각 픽셀은 8비트 int로 구성되어 있음.
  • 각 픽셀의 범위는 0-255, 0은 검은색, 255는 흰색을 의미함.
import cv2 
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
img
array([[[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

       [[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

       [[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]]], dtype=uint8)
  • 3차원 배열을 의미. 각 채널은 Blue, Green, Red를 의미한다.

image Load

  • Convert PNG into JPEG
  • 사용할 이미지는 아래와 같다.

image = cv2.imread("MyPic.png")
cv2.imwrite("MyPic.jpg", image)
True

imread Options

import cv2
grayImage = cv2.imread("MyPic.png", cv2.IMREAD_GRAYSCALE)
cv2.imwrite("output/MyPicGray.png", grayImage)
True

  • OpenCV 이미지는 2D[0, 0] or 3D[0, 0, 0] array of numpy.array type.
    • 이 때, 첫번째 인덱스는 y coordinate or row를 의미합니다.
    • 두번째 인덱스는 x coordinate or column을 의미합니다.
    • 마지막 인덱스는 color channel을 의미합니다.

bytearray

  • 파이썬 내부 모듈인 bytearray를 활용하도록 합니다.
import cv2
import numpy as np
import os

# Make an array of 12,000 random bytes
randomByteArray = bytearray(os.urandom(120000))
flatNumpyArray = np.array(randomByteArray)
# np.random.ranint(0, 256, 12000)

grayImage = flatNumpyArray.reshape(300, 400)
print(grayImage.shape)
cv2.imwrite("output/RandomGray.png", grayImage)
(300, 400)





True

bgrImage = flatNumpyArray.reshape(200, 200, 3)
cv2.imwrite("output/RandomColor.png", bgrImage)
True

이미지 데이터 핸들링

  • 이미지를 불러와서 약간의 가공을 진행하도록 합니다.
    • 먼저, color image에 white 점(dot)을 추가하도록 합니다.
import cv2
import matplotlib.pyplot as plt

img = cv2.imread("MyPic.png")
plt.imshow(img)
plt.title("Original Pic")
plt.show()

png

import cv2
import matplotlib.pyplot as plt

def plot_comparison(original, filtered, title_filtered):
  fig, (ax1, ax2) = plt.subplots(ncols = 2, figsize=(16, 12), sharex=True, sharey=True)
  ax1.imshow(original, cmap = plt.cm.gray)
  ax1.set_title("original")
  ax1.axis('off')
  ax2.imshow(filtered, cmap = plt.cm.gray)
  ax2.set_title(title_filtered)
  ax2.axis('off')

img = cv2.imread("MyPic.png")
img[249, 255] = [255, 255, 255]
img[250, 255] = [255, 255, 255]
img[251, 255] = [255, 255, 255]
img[252, 255] = [255, 255, 255]
img[253, 255] = [255, 255, 255]
img[249, 254] = [255, 255, 255]
img[250, 254] = [255, 255, 255]
img[251, 254] = [255, 255, 255]
img[252, 254] = [255, 255, 255]
img[253, 254] = [255, 255, 255]
cv2.imwrite("output/MyPic_mask.png", img)
True
img = cv2.imread("MyPic.png")
img2 = cv2.imread("output/MyPic_mask.png")
plot_comparison(img, img2, "Masked pic")

png