コントラスト伸張 && エッジ検出の作成

@

コントラスト伸張

コントラストは画像内の輝度値の範囲の尺度であり、最大画素値と最小画素値の差として定義されます。8ビット画像のフルコントラストは $ 255 (max) – 0 (min) = 255$ です。

それより小さい値は、画像が持ち得る最大のコントラストよりも低いことを意味します。コントラスト伸張は、線形スケーリングを用いて輝度値の範囲を広げることにより、画像のコントラストを改善することを試みます。

$𝐼$ を元の入力画像、$𝑂$ を出力画像と仮定します。許容される最小画素値および最大画素値を $𝑎$ と \𝑏 とし(8ビット画像の場合、$𝑎$ = 0 および $𝑏$ = 255 を意味します)、$𝐼$ 内で見出された最小画素値および最大画素値を $𝑐$ と $𝑑 $ とします。このとき、コントラスト伸張された画像 $𝑂$ は以下の関数によって与えられます:

\( 𝑂(𝑥, 𝑦) = (𝐼(𝑥, 𝑦) − 𝑐)( \frac {b-a}{d-c}) +a\)

エッジ検出

エッジは画像における意味情報の重要な情報源です。人間の視覚認知においては、異なる輝度、色、またはテクスチャを持つ領域の境界線として生じます。グレースケール画像は、異なる輝度の領域が異なる高さに存在する2D地形と考えることができます。画像 $𝐼$ における異なる輝度領域間の遷移は急な勾配が存在することを意味し、これを勾配(ベクトル)として定式化します:

$$ $ \nabla =(\frac{\partial I}{\partial x},\frac{\partial I}{\partial y})$ $$

画像 𝐼 は離散的であるため、連続微分 $\frac{\partial I}{\partial x}$ を有限差分によって近似する必要があります。有限差分を実行する畳み込みカーネルの簡単な例として、次のように定義されるSobelフィルタがあります:

$$ $ S_x = \begin{bmatrix} 1 & 0 & -1\\ 2 & 0 & -2 \\ 1 & 0 & -1 \ \end{bmatrix}$ $$
$$ $ S_y = \begin{bmatrix} 1 & 2 & 1\\ 0 & 0 & -0 \\ -1 & -2 & -1 \end{bmatrix}$ $$
heading
code
def edge_detection(image, filter):
    image_x = convolution2D(image, filter)
 
    plt.imshow(image_x, cmap='gray')
    plt.title("Horizontal Edge S_x")
    plt.show()
 
    image_y = convolution2D(image, np.flip(filter.T, axis=0))
 
 
    plt.imshow(image_y, cmap='gray')
    plt.title("Vertical Edge S_y")
    plt.show()
    G_magnitude = np.sqrt(np.square(image_x) + np.square(image_y))
    max_value = get_max_ele(G_magnitude)
    print("max value is :",max_value,"we need normalize it")
    # normalize the result
    G_magnitude = G_magnitude * 255.0 / max_value
 
    plt.imshow(G_magnitude, cmap='gray')
    plt.title("result")
    plt.show()
 
    return G_magnitude
<

评论 · Comments (0)

需要 MetaMask 等以太坊钱包,签名不花 gas。