pythonでの画像データお互い変換

目次

画像データロード
– IPythonで画像データを表示
OpenCV
– cv型データを読み込み
– cv型データを表示
– Matplotlibでcv型データを表示
– cv型データ→pil型の変換
– cv型データ→sk型の変換
Pillow
– pil型データを読み込み
– pil型データを表示
– io.BytesIOでpil型データを表示
– Matplotlibでpil型データを表示
– pil型データ→cv型の変換
skimage
– sk型データを読み込み
– sk型データを表示
– Matplotlibでsk型データを表示
– sk型データ→cv型の変換
– sk型データ→pil型の変換
Matplotlib
– Matplotlib型データを読み込み
– Matplotlib型データを表示

PythonはOpencv、Pillow、 scikit-image、Matplotlibなどの複数便利なライブラリがあります。各ライブラリはデータ型が違います。今回の記事は画像データお互い変換をまとめたいと思います。それぞれのライブラリで特徴があります。

実験の環境は google colabです。

画像データロード

# 画像をロード

import urllib

import urllib.request

img_src = “https://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Origami_cranes_on_match_heads.jpg/320px-Origami_cranes_on_match_heads.jpg”

img_file = ‘image.jpg’

urllib.request.urlretrieve(img_src, img_file)

(‘image.jpg’, <http.client.HTTPMessage at 0x7fbef83dc358>)

 

 – IPythonで画像データを表示

# IPython show image

from IPython.display import Image

Image(‘image.jpg’)

OpenCV

 – cv型データを読み込み

import numpy as np

import cv2

# Load an color image

cv_img = cv2.imread(‘image.jpg’,1)

 – cv型データを表示

from google.colab.patches import cv2_imshow

cv_img = cv2.imread(‘image.jpg’,1)

cv2_imshow(cv_img)

– Matplotlibでcv型データを表示

# Matplotlibで画像データを表示

import cv2

import matplotlib.pyplot as plt

def show_im(img):

plt.axis(‘off’)

show_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

plt.imshow(show_img)

plt.show()

show_im(cv_img)

– cv型データ→pil型の変換

from PIL import Image

import cv2

def cv2pil(image):

”’ OpenCV型 -> PIL型 ”’

new_image = image.copy()

if new_image.ndim == 2:  # モノクロ

pass

elif new_image.shape[2] == 3:  # カラー

new_image = cv2.cvtColor(new_image, cv2.COLOR_BGR2RGB)

elif new_image.shape[2] == 4:  # 透過

new_image = cv2.cvtColor(new_image, cv2.COLOR_BGRA2RGBA)

new_image = Image.fromarray(new_image)

return new_image

cv_img = cv2.imread(‘image.jpg’,1)

pil_img = cv2pil(cv_img)

 – cv型データ→sk型の変換

from skimage.util import img_as_float

cv_img = cv2.imread(‘image.jpg’,1)

sk_image = img_as_float(cv_img)

sk_image = sk_image[:, :, ::-1] # convert image from BGR (opencv) to RGB (skimage)

 

Pillow

– pil型データを読み込み

from PIL import Image

pil_img = Image.open(“image.jpg”)

 – pil型データを表示

pil_img

– io.BytesIOでpil型データを表示

# io.BytesIOで作ったバッファに保存し、そのバッファをIPython.display.Imageで表示する。

import io

from IPython.display import Image

buf = io.BytesIO()

pil_img.save(buf,”PNG”)

data = buf.getvalue()

Image(‘image.jpg’)

– Matplotlibでpil型データを表示

# matplotlibとmatplotlibで表示する。

import matplotlib.pyplot as plt

import numpy as np

plt.imshow(np.array(pil_img))

plt.axis(‘off’)

plt.show()

 – pil型データ→cv型の変換

from PIL import Image

def pil2cv(image):

”’ PIL型 -> OpenCV型 ”’

new_image = np.array(image, dtype=np.uint8)

if new_image.ndim == 2:  # モノクロ

pass

elif new_image.shape[2] == 3:  # カラー

new_image = cv2.cvtColor(new_image, cv2.COLOR_RGB2BGR)

elif new_image.shape[2] == 4:  # 透過

new_image = cv2.cvtColor(new_image, cv2.COLOR_RGBA2BGRA)

return new_image

cv_img = pil2cv(pil_img)

skimage

 – sk型データを読み込み

from skimage import io

sk_img = io.imread(‘image.jpg’)

 – sk型データを表示

from skimage import io

from matplotlib import pyplot as plt

io.imshow(sk_img)

plt.axis(‘off’)

plt.show()

– Matplotlibでsk型データを表示

# Matplotlibでsk型データを表示

import matplotlib.pyplot as plt

def show_image(image, title=’Image’, cmap_type=’gray’):

plt.imshow(image, cmap=cmap_type)

plt.title(title)

plt.axis(‘off’)

show_image(sk_img, ‘sk_img’);

 – sk型データ→cv型の変換

sk型では、numpyのようにデータがはいっています。そのためBGR形式ならば変更

必要です。

from skimage import img_as_ubyte

cv_img = img_as_ubyte(sk_img)

cv_img = cv_img[:, :, ::-1] # convert image from RGB (skimage) to BGR (opencv)

 – sk型データ→pil型の変換

sk型からPill型は、バイト列に変換する必要があります。

from skimage import io

import matplotlib.pyplot as plt

from PIL import Image

sk_img = io.imread(‘image.jpg’)

pil_img = Image.fromarray(np.uint8(sk_img))

Matplotlib

– Matplotlib型データを読み込み

import matplotlib.pyplot as plt

mp_img = plt.imread(‘image.jpg’)

 

import matplotlib.image as mpimage

mp_img = mpimage.imread(‘image.jpg’)

 - Matplotlib型データを表示

mp_img = plt.imread(‘image.jpg’)

plt.imshow(mp_img)

plt.axis(‘off’)

plt.show()

参照の資料:

https://docs.opencv.org/master/

https://pillow.readthedocs.io/en/stable/

https://scikit-image.org/docs/stable/

https://matplotlib.org/3.3.3/contents.html

 

担当者:HM

香川県高松市出身 データ分析にて、博士(理学)を取得後、自動車メーカー会社にてデータ分析に関わる。その後コンサルティングファームでデータ分析プロジェクトを歴任後独立 気が付けばデータ分析プロジェクトだけで50以上担当

理化学研究所にて研究員を拝命中 応用数理学会所属