[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()
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")
- 오른쪽 그림에서 오른쪽 하단에 보면 하얀색 Dots(점)들이 생긴 것을 확인 할 수 있다…
- 이와 비슷한 방식으로 itemset or ROI(Regions of Interests) 등을 사용할 수 있다.