Реализация растяжения контрастности && обнаружения границ

@

Растяжение контрастности

Контрастность — это мера диапазона значений интенсивности на изображении, определяемая как разность между максимальным и минимальным значениями пикселей. Полная контрастность 8-битного изображения составляет $ 255 (max) – 0 (min) = 255$.

Любое меньшее значение означает, что изображение имеет более низкую контрастность, чем возможно. Растяжение контрастности направлено на улучшение контраста изображения путем растяжения диапазона значений интенсивности с помощью линейного масштабирования.

Предположим, что $𝐼$ — исходное входное изображение, а $𝑂$ — выходное изображение. Пусть $𝑎$ и \𝑏 — минимальное и максимальное допустимые значения пикселей (для 8-битного изображения это означает $𝑎$ = 0 и $𝑏$ = 255), а $𝑐$ и $𝑑 $ — минимальное и максимальное значения пикселей, найденные в $𝐼$. Тогда изображение с растянутой контрастностью $𝑂$ задается функцией:

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

Обнаружение границ

Границы являются важным источником семантической информации на изображениях. В зрительном восприятии человека они возникают на стыках между областями с разной интенсивностью, цветом или текстурой. Полутоновое изображение можно представить как двумерный рельеф, где области с разной интенсивностью находятся на разной высоте. Переход между областями с разной интенсивностью на изображении $𝐼$ означает наличие крутого склона, который мы формализуем как вектор градиента:

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

Поскольку изображение 𝐼 дискретно, нам необходимо аппроксимировать непрерывные производные $\frac{\partial I}{\partial x}$ конечными разностями. Простыми примерами ядер свертки, выполняющих вычисление конечных разностей, являются фильтры Собеля, определяемые следующим образом:

$$ $ 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")
    # нормализация результата
    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。