b436: 圖片的梯度再進化
Tags : 影像處理
Accepted rate : 14人/16人 ( 88% ) [非即時]
評分方式:
Tolerant

最近更新 : 2022-10-27 21:55

Content



我們發現梯度彷彿輪廓,但是不太清晰。試著把它變清晰。

複習一下梯度,數學式子如下:

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範圍。(應該除以多少呢?自己推理吧。)最後求出這麼一張圖片:



請你也求出這麼一張圖片。

Input

一張圖片:兩個整數 W H (1 <= W, H <= 256),是圖片的寬和高;接下來的 H 行,每行有 W*3 個整數,是每個像素的 RGB 值 (0 <= R, G, B <= 255)。

Output

請輸出處理後的圖片。計算結果四捨五入。

 

Sample Input #1
2 2
0 0 0 255 255 255
255 255 255 255 255 255
Sample Output #1
2 2
191 191 191 128 128 128
128 128 128 64 64 64
測資資訊:
記憶體限制: 64 MB
公開 測資點#0 (33%): 1.0s , <1K
公開 測資點#1 (33%): 1.0s , <1K
公開 測資點#2 (34%): 1.0s , <1M
Hint :

1. 如果不熟悉梯度,可以先試試看「b434: 圖片的梯度」。

Tags:
影像處理
出處:
[管理者: DJWS(...) ]


ID User Problem Subject Hit Post Date
沒有發現任何「解題報告」