我們發現梯度彷彿輪廓,但是不太清晰。試著把它變清晰。
複習一下梯度,數學式子如下:
∇XR(x,y) = R(x+1,y) - R(x,y) (橫向相減:右邊減自己)
∇YR(x,y) = R(x,y+1) - R(x,y) (直向相減:下邊減自己)
只有右邊減自己。左邊漏掉了?因此我們補上自己減左邊的差值:
SXR(x,y) = ( R(x+1,y) - R(x,y) ) + ( R(x,y) - R(x-1,y) ) = R(x+1,y) - R(x-1,y) (橫向相減:右邊減自己、自己減左邊的和)
右邊減自己、自己減左邊,只有一個點。然而輪廓通常是一條線。因此納入上面像素和下面像素,三點連線,疊加差距,凸顯輪廓。
SXR(x,y) = ( R(x+1,y-1) - R(x-1,y-1) ) + ( R(x+1,y) - R(x-1,y) ) + ( R(x+1,y+1) - R(x-1,y+1) ) (橫向相減,上中下三個像素的結果總和)
我們明明是算中間像素的橫向差距,卻把上面像素和下面像素的差距也加進來,使得中間像素的差距不明顯。因此中間像素的差距乘以二,弄得明顯一點:
SXR(x,y) = ( R(x+1,y-1) - R(x-1,y-1) ) + 2 * ( R(x+1,y) - R(x-1,y) ) + ( R(x+1,y+1) - R(x-1,y+1) ) (中間像素的結果先乘以二)
式子很難讀。提取係數,寫成二維矩陣,方便閱讀:
計算很直覺。二維矩陣中心對準像素,點對點相乘,再相加,得到計算結果。超出圖片邊界的部分,想像成像素複製延伸。
這就是有名的 Sobel operator。雖然是憑感覺瞎掰的,但是好算、合用。大家都喜歡。
接著累計兩個方向的變化程度。寫成數學式子就是:
sqrt((SXR)2 + (SYR)2)
不過sqrt有精確度問題、運算時間也很長,所以大家都改用:
|SXR| + |SYR|
再將數值調整成符合RGB範圍。(應該除以多少呢?自己推理吧。)最後求出這麼一張圖片:
請你也求出這麼一張圖片。
一張圖片:兩個整數 W H (1 <= W, H <= 256),是圖片的寬和高;接下來的 H 行,每行有 W*3 個整數,是每個像素的 RGB 值 (0 <= R, G, B <= 255)。
請輸出處理後的圖片。計算結果四捨五入。
2 2 0 0 0 255 255 255 255 255 255 255 255 255
2 2 191 191 191 128 128 128 128 128 128 64 64 64
1. 如果不熟悉梯度,可以先試試看「b434: 圖片的梯度」。
編號 | 身分 | 題目 | 主題 | 人氣 | 發表日期 |
沒有發現任何「解題報告」
|