Scrittura di espansione del contrasto && rilevamento dei bordi

@

Espansione del contrasto

Il contrasto è una misura dell'intervallo dei valori di intensità in un'immagine ed è definito come la differenza tra il valore massimo e il valore minimo del pixel. Il contrasto completo di un'immagine a 8 bit è $ 255 (max) – 0 (min) = 255$.

Qualsiasi valore inferiore a questo indica che l'immagine presenta un contrasto più basso rispetto a quello possibile. L'espansione del contrasto tenta di migliorare il contrasto dell'immagine espandendo l'intervallo dei valori di intensità mediante un ridimensionamento lineare.

Si assuma che $𝐼$ sia l'immagine di input originale e $𝑂$ sia l'immagine di output. Siano $𝑎$ e \𝑏 i valori di pixel minimo e massimo consentiti (per un'immagine a 8 bit ciò significa $𝑎$ = 0 e $𝑏$ = 255) e siano $𝑐$ e $𝑑 $ i valori di pixel minimo e massimo trovati in $𝐼$. Allora l'immagine con contrasto espanso $𝑂$ è data dalla funzione:

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

Rilevamento dei bordi

I bordi rappresentano un'importante fonte di informazioni semantiche nelle immagini. Nella percezione visiva umana, essi si manifestano in corrispondenza delle divisioni tra aree con diversa intensità, colore o texture. Un'immagine in scala di grigi può essere pensata come un paesaggio 2D con aree di diversa intensità situate ad altezze differenti. Una transizione tra aree di diversa intensità in un'immagine $𝐼$ indica la presenza di una pendenza ripida, che formalizziamo come il (vettore) gradiente:

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

Poiché l'immagine 𝐼 è discreta, dobbiamo approssimare le derivate continue $\frac{\partial I}{\partial x}$ mediante differenze finite. Semplici esempi di kernel di convoluzione che eseguono la differenziazione finita sono i filtri di Sobel definiti come segue:

$$ $ 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("Bordo orizzontale S_x")
    plt.show()
 
    image_y = convolution2D(image, np.flip(filter.T, axis=0))
 
 
    plt.imshow(image_y, cmap='gray')
    plt.title("Bordo verticale S_y")
    plt.show()
    G_magnitude = np.sqrt(np.square(image_x) + np.square(image_y))
    max_value = get_max_ele(G_magnitude)
    print("il valore massimo è :",max_value,"dobbiamo normalizzarlo")
    # normalizza il risultato
    G_magnitude = G_magnitude * 255.0 / max_value
 
    plt.imshow(G_magnitude, cmap='gray')
    plt.title("risultato")
    plt.show()
 
    return G_magnitude
<

评论 · Comments (0)

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