このサイトにあるskimage-tutorialsをやってみようと思う。画像処理はpython programmingの基本でもあるので、基礎固めの一環として、画像周辺の知識を深めておいた方がいいようだ。
!git clone --depth=1 https://github.com/scikit-image/skimage-tutorials
チュートリアルディレクトリに移動する。
cd skimage-tutorials
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
import numpy as np
from matplotlib import pyplot as plt
plt.rcParams['figure.figsize'] = 16, 8
plt.rcParams["font.size"] = "17"
画像はnumpyアレイ¶
Images are represented in scikit-image using standard numpy arrays. This allows maximum inter-operability with other libraries in the scientific Python ecosystem, such as matplotlib and scipy.
scikit-imageでは、画像はnumpyアレイを使って表されている。この事が、マットプロットリブやサイパイ(サイピー)などの科学的なPythonエコシステムにおいて、他のライブラリとの最大限の相互運用を可能にしてくれている。
Let’s see how to build a grayscale image as a 2D array:
2次元アレイとしてグレイスケール画像を構築する方法を見ていく。
random_image = np.random.random([500, 500])
plt.imshow(random_image, cmap='gray')
plt.colorbar();
The same holds for “real-world” images:
同じことは実在の画像にもあてはまる。
from skimage import data
coins = data.coins()
print('Type:', type(coins))
print('dtype:', coins.dtype)
print('shape:', coins.shape)
plt.imshow(coins, cmap='gray');
A color image is a 3D array, where the last dimension has size 3 and represents the red, green, and blue channels:
カラー画像は、最後の次元がサイズ3を持つ、赤、緑、青チャンネルを表す三次元アレイ。
cat = data.chelsea()
print("Shape:", cat.shape)
print("Values min/max:", cat.min(), cat.max())
plt.imshow(cat);
These are just NumPy arrays. E.g., we can make a red square by using standard array slicing and manipulation:
cat[10:110, 10:110, :] = [255, 0, 0] # [red, green, blue]
plt.imshow(cat);
Images can also include transparent regions by adding a 4th dimension, called an alpha layer.
画像は、アルファレイヤーと呼ばれる第4の次元を加えることで透明領域を含むことも可能だ。
他の形とそれらの意味¶
Image type | Coordinates |
---|---|
2D grayscale | (row, column) |
2D multichannel | (row, column, channel) |
3D grayscale (or volumetric) | (plane, row, column) |
3D multichannel | (plane, row, column, channel) |
matplotlibで画像表示¶
from skimage import data
img0 = data.chelsea()
img1 = data.rocket()
import matplotlib.pyplot as plt
f, (ax0, ax1) = plt.subplots(1, 2, figsize=(20, 10))
ax0.imshow(img0)
ax0.set_title('Cat', fontsize=18)
ax0.axis('off')
ax1.imshow(img1)
ax1.set_title('Rocket', fontsize=18)
ax1.set_xlabel(r'Launching position $\alpha=320$')
ax1.vlines([202, 300], 0, img1.shape[0], colors='magenta', linewidth=3, label='Side tower position')
ax1.plot([168, 190, 200], [400, 200, 300], color='white', linestyle='--', label='Side angle')
ax1.legend();
描画についての詳細は以下を参照のこと。