ImageJ → Python/scikit-imageのチートシート

使いそうな項目を手あたり次第まとめました。

以下、画像データを格納した`numpy`配列を変数`img`など、画像リストは`imgs`などで代表させます。また、直接的な対応がつかないものも多々あるのでご注意ください。

## 1. Fileメニュー

拡張子によっては`tifffile`, `mrcfile`などのインストールが必要です。

|ImageJ|Python|備考|
|:-:|:-:|:--|
|File>Open|`skimage.io.imread`, `tifffile.imread`など||
|File>Save|`skimage.io.imsave`, `tifffile.imsave`など||

## 2. Editメニュー

ほとんどGUIやROI関連なので割愛します。

## 3. Imageメニュー

|ImageJ|Python|備考|
|:-:|:-:|:--|
|Image>Type>8-bit|`img.astype(np.uint8)`||
|Image>Type>16-bit|`img.astype(np.uint16)`||
|Image>Type>32-bit|`img.astype(np.float32)`||
|Image>Adjust>threshold|`img > thr`,`img < thr`|`thr`は閾値で、`skimage.filters.threshold_otsu`などを使って推定可能|
|Image>Color>Split Channels|`[img[:, i] for i in range(img.shape[1])]`|`i`がどの次元に対応するかは画像による|
|Image>Color>Merge Channels|`np.stack(imgs)`||
|Image>Stack>Images to Stack|`np.stack(imgs)`||
|Image>Stack>Stack to Images|`[img[:, i] for i in range(img.shape[1])]`|`i`がどの次元に対応するかは画像による|
|Image>Stack>Make Montage|`np.block([[img1, img2],[img3, img4]])`|チャネルごとに色分けする場合はRGBに直す必要がある。また、2&times;2に3つの画像を配置する場合は最後の空欄用の配列も与える必要がある。|
|Image>Stack>Reslice|`skimage.measure.profile_line`||
|Image>Stack>Z Project|`np.mean(img, axis=0)`など|Z Projectの種類と画像の次元によって関数や`axis`を使い分ける|
|Image>Hyperstacks>Stack to Hyperstack|`img.reshape`||
|Image>Hyperstacks>Stack to Hyperstack|`img.reshape`||
|Image>Crop|`img[100:300,200:400]`など||
|Image>Duplicate|`img.copy()`||
|Image>Scale|`skimage.transform.rescale`または`skimage.transform.resize`|何倍かを指定する場合は`rescale`、最終的な形状を指定する場合は`resize`|
|Image>Transform>Flip Horizontally|`img[:, :, ::-1]`|xがどの次元なのか要確認|
|Image>Transform>Flip Vertically|`img[:, ::-1, :]`|yがどの次元なのか要確認|
|Image>Transform>Flip Z|`img[::-1, :, :]`|zがどの次元なのか要確認|
|Image>Transform>Rotate 90 Degrees to Right|`np.rot90(img, 3)`||
|Image>Transform>Rotate 90 Degrees to Left|`np.rot90(img)`||
|Image>Transform>Rotate|`skimage.transform.rotate`||
|Image>Transform>Translate|`scipy.ndimage.shift`||
|Image>Transform>Bin|`img.shape==(100, 200)`で2&times;2のbinningをかけるとすると、`img.reshape(50, 2, 100, 2).mean(axis=(1, 3))`で実現できる。||
|Image>Transform>Zoom|`skimage.transform.rescale`または`skimage.transform.resize`|何倍かを指定する場合は`rescale`、最終的な形状を指定する場合は`resize`|

###### Binningのやり方



## 4. Processメニュー

|ImageJ|Python|備考|
|:-:|:-:|:--|
|Process>Smooth|`scipy.ndimage.uniform_filter(img, size=3)`||
|Process>Sharpen|`scipy.ndimage.convolve(img, np.array([[-1,-1,-1],[-1,12,-1],[-1,-1,-1]])/4)`||
|Process>Find Edges|`skimage.filters.sobel`, `skimage.filters.prewitt`など||
|Process>Find Maxima|`skimage.morphology.local_maxima`|skimage.morphology.h_maxima, `skimage.features.peak_local_max`などのほうが高性能|
|Process>Enhance Contrast|`skimage.filters.rank.enhance_contrast`||
|Process>Noise>...|`np.random`などで代用||
|>Process>Binary>Erode|`skimage.morphology.binary_erosion`||
|Process>Binary>Dilate|`skimage.morphology.binary_dilation`||
|Process>Binary>Open|`skimage.morphology.binary_opening`||
|Process>Binary>Close|`skimage.morphology.binary_closing`||
|Process>Binary>Fill Holes|`scipy.ndimage.binary_fill_holes`||
|Process>Binary>Skeletonize|`skimage.morphology.skeletonize`または`skimage.morphology.medial_axis`||
|Process>Binary>Distance Map|`scipy.ndimage.distance_transform_edt`など||
|Process>Binary>Watershed|`skimage.segmentation.watershed`|前処理が必要。[こちら](https://scikit-image.org/docs/stable/auto_examples/segmentation/plot_watershed.html)を参考。|
|Process>Binary>Voronoi|`scipy.spatial.Voronoi`を利用|けっこう大変|
|Process>Math|`numpy`でOK||
|Process>FFT|`scipy.fft.fftn`, `scipy.fft.ifft`, `np.fft.fftshift`を使う|`np.fft`モジュールでは強制的に`np.complex128`に直されるので、オーバーフローのおそれがある|
|Process>Filters>Convolve|`scipy.ndimage.convolve`||
|Process>Filters>Gaussian Blur (3D)|`skimage.filters.gaussian`||
|Process>Filters>Median (3D)|`skimage.filters.median`|Radiusと等価な`footprint`は`skimage.morphology.disk`で作れる|
|Process>Filters>Mean (3D)|`scipy.ndimage.convolve`で代用|Radiusと等価な`footprint`は`skimage.morphology.disk`で作れる|
|Process>Filters>Minimum (3D)|`scipy.ndimage.minimum_filter`|Radiusと等価な`footprint`は`skimage.morphology.disk`で作れる|
|Process>Filters>Maximum (3D)|`scipy.ndimage.maximum_filter`|Radiusと等価な`footprint`は`skimage.morphology.disk`で作れる|
|Process>Filters>Variance (3D)|`scipy.ndimage.convolve(img**2, disk) - scipy.ndimage.convolve(img, disk)`で実現可能||
|Process>Filters>Top Hat|`skimage.morphology.white_tophat`または`skimage.morphology.black_tophat`|Radiusと等価な`footprint`は`skimage.morphology.disk`で作れる|
|Process>Filters>Image Calculator|`numpy`でOK||
|Process>Filters>Subtract Background|`skimage.restoration.rolling_ball`|ImageJでは先に3&times;3のmean filterをかけており、また8-bitにして計算しているため注意。|

## 5. Analyzeメニュー

ImageJではROIを使いますが、`skimage`ではラベルを使います。そのため、対応がほとんどつきません。唯一対応が分かりやすいのは

|ImageJ|Python|備考|
|:-:|:-:|:--|
|Analyze>Analyze Particles|`skimage.measure.label`||

でしょうか。

以下では、`skimage.measure.regionprops`による計測と、ImageJのMeasureとの対応を書きます。ImageJでは"Analyze>Set Measurement"で計測する特徴量を指定する一方で、`skimage.measure.regionprops`では返り値の`RegionProperties`オブジェクトのpropertyとして特徴量を取得します。サポートされていない特徴量は`extra_properties=...`を与えることで対応できます。
`RegionProperties`オブジェクトを`props`とします。

|ImageJのSet Measurement|RegionProperties|備考|
|:-:|:-:|:--|
|Area|`props.area`||
|Mean gray value|`props.intensity_mean`||
|Standard deviation|`extra_properties`で対応||
|Modal gray value|`extra_properties`で対応||
|Min & max gray value|`props.intensity_min`と`props.intensity_max`||
|Centroid|`props.centroid`||
|Center of mass|`props.centroid_weighted`||
|Perimeter|`props.perimeter`または`props.perimeter_crofton`||
|Bounding rectangle|`props.bbox`||
|Fit ellipse|`props.orientation`, `props.axis_minor_length`, `props.axis_major_length`を使う||
|Shape descriptors|`props.eccentricity`や`props.solidity`など||
|Feret's diameter|`props.feret_diameter_max`||
|Integrated density|`props.area`と`props.mean`を使う||
|Median|`extra_properties`で対応||
|Skewness|`extra_properties`で対応||
|Kurtosis|`extra_properties`で対応||
|Area fraction|`extra_properties`で対応||