グレースケールフィルターをRGB画像に適用する#

グレースケール画像では動作するように設計されているが、カラー画像では動作しないフィルターは多数あります。RGB画像に適応できる関数の作成プロセスを簡素化するために、scikit-imageは`adapt_rgb`デコレータを提供しています。

`adapt_rgb`デコレータを実際に使用するには、グレースケールフィルターで使用するRGB画像をどのように適用するかを決定する必要があります。2つの定義済みハンドラがあります。

each_channel

RGBチャネルそれぞれをフィルターに1つずつ渡し、結果をRGB画像にstitchingします

hsv_value

RGB画像をHSVに変換し、値チャネルをフィルターに渡します。フィルター処理された結果はHSV画像に挿入され、RGBに戻されます。

以下では、いくつかのグレースケールフィルターで`adapt_rgb`の使用法を示します。

from skimage.color.adapt_rgb import adapt_rgb, each_channel, hsv_value
from skimage import filters


@adapt_rgb(each_channel)
def sobel_each(image):
    return filters.sobel(image)


@adapt_rgb(hsv_value)
def sobel_hsv(image):
    return filters.sobel(image)

これらの関数を通常どおり使用できますが、グレースケール画像とカラー画像の両方で機能するようになりました。カラー画像で結果をプロットしてみましょう。

from skimage import data
from skimage.exposure import rescale_intensity
import matplotlib.pyplot as plt

image = data.astronaut()

fig, (ax_each, ax_hsv) = plt.subplots(ncols=2, figsize=(14, 7))

# We use 1 - sobel_each(image) but this won't work if image is not normalized
ax_each.imshow(rescale_intensity(1 - sobel_each(image)))
ax_each.set_xticks([]), ax_each.set_yticks([])
ax_each.set_title("Sobel filter computed\n on individual RGB channels")

# We use 1 - sobel_hsv(image) but this won't work if image is not normalized
ax_hsv.imshow(rescale_intensity(1 - sobel_hsv(image)))
ax_hsv.set_xticks([]), ax_hsv.set_yticks([])
ax_hsv.set_title("Sobel filter computed\n on (V)alue converted image (HSV)")
Sobel filter computed  on individual RGB channels, Sobel filter computed  on (V)alue converted image (HSV)
Text(0.5, 1.0, 'Sobel filter computed\n on (V)alue converted image (HSV)')

値フィルター処理された画像の結果は元の画像の色を保持しますが、チャネルフィルター処理された画像はより驚くような方法で組み合わされていることに注意してください。他の一般的なケース、たとえばスムージングでは、チャネルフィルター処理された画像は値フィルター処理された画像よりも優れた結果を生成します。

`adapt_rgb`用に独自のハンドラ関数を作成することもできます。そのためには、次のシグネチャを持つ関数を作成するだけです。

def handler(image_filter, image, *args, **kwargs):
    # Manipulate RGB image here...
    image = image_filter(image, *args, **kwargs)
    # Manipulate filtered image here...
    return image

`adapt_rgb`ハンドラは、画像が最初の引数であるフィルター用に記述されていることに注意してください。

非常に簡単な例として、RGB画像をグレースケールに変換して、フィルター処理された結果を返すことができます。

from skimage.color import rgb2gray


def as_gray(image_filter, image, *args, **kwargs):
    gray_image = rgb2gray(image)
    return image_filter(gray_image, *args, **kwargs)

デコレータされた関数が任意の数の位置引数とキーワード引数を持つことができるように、引数をフィルターに渡すために`* args`と`** kwargs`を使用するシグネチャを作成することが重要です。

最後に、以前と同じように`adapt_rgb`でこのハンドラを使用できます。

@adapt_rgb(as_gray)
def sobel_gray(image):
    return filters.sobel(image)


fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(7, 7))

# We use 1 - sobel_gray(image) but this won't work if image is not normalized
ax.imshow(rescale_intensity(1 - sobel_gray(image)), cmap=plt.cm.gray)
ax.set_xticks([]), ax.set_yticks([])
ax.set_title("Sobel filter computed\n on the converted grayscale image")

plt.show()
Sobel filter computed  on the converted grayscale image

注記

RGB画像を検出するために配列形状の非常に単純なチェックが使用されるため、3Dボリュームまたは非RGB空間のカラー画像をサポートする関数には`adapt_rgb`はお勧めしません.

**スクリプトの合計実行時間:**(0分2.019秒)

Sphinx-Galleryによって生成されたギャラリー