Peter's codebook A blog full of codes

求影像梯度 -- ZeroJudge b436

難得這次暑假很長, 試著實作出求影像梯度的方法。 影像的梯度就是像素間的變化值, 最簡單的方式是由右方像素減自己、下方像素減自己, 就可以得出基本的影像梯度(看起來像影像邊緣)。 另外一個方法是,使用 Sobel operator 做卷積(常用來作邊緣偵測), 再把 x 方向、 y 方向卷積出來的結果 / 8.0 ,就可以得到整張影像的梯度。 至於為什麼要 / 8.0 ,仔細觀察 Sobel operator 的陣列就可以明白: X 向 Sobel operator: Y 向 Sobel operator: X 方向卷積最多使像素值為 255 的 4 倍, Y 方向卷積最多使像素值為 255 的 4 倍。 因此考慮 X, Y 方向得到的卷積值,需要除 8... Read more

圖像縮放 -- Bilinear Interpolation, Nearest Neighbor Interpolation

難得這次暑假很長, 再來練習個簡單的圖像縮放, 使用的方法有 Bilinear Interpolation (雙線性內插) 和 Nearest Neighbor Interpolation (最近鄰居內插) Bilinear Interpolation Bilinear Interpolation 的方法: 找到影像縮放後,新像素點在原始影像對應的位置,並根據這個位置它左上、左下、右上、右下的臨近四個像素做兩次線性內插。 第一次內插是利用左上、右上;左下、右下分別做一次內插,這次內插會得到兩個點,一上一下。 再根據這兩個點,做一次內插,會得到新像素在新位置的 R,B,G,A 值。 Nearest Neighbor Interpolation Nearest Ne... Read more

ZeroJudge b423 -- 魔術橡皮擦

ZeroJudge 上的簡單影像處理練習題, 實作修圖軟體上常用的「魔術橡皮擦」工具(簡單版), 蠻有趣的,剛好適合拿來消磨時間, 於是很隨興地寫了一點 C++ 的 code。 需要注意,DIFF 有可能為負數,要先判掉。 code 會寫得那麼長,是為了能真的拿一張圖片來測試結果。 結果 Before: After: Before: After1: AfterInf: 我很喜歡初音的,會拿她的圖來當範例並沒有任何特別用意。 (本來只想找幾張有 Alpha 通道的圖,就順便找初音的圖片了~ ) 詳細可以到我的 GitHub 上面查看原始碼,使用 lodepng 開檔存檔。 傳送門 ZJ_b423 ZeroJudge b423 程式碼 ... Read more

Uva 100 -- The 3n + 1 problem

Uva 的第一題,用線段樹殺根本就是大才小用。 傳送門 Uva100 ZJ_d712 <- 這裡的測資比較硬 程式碼 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 // 在 ZeroJudge 底下測試的結果 // 3326353, AC, 96ms, 3.4MB #include <string.h> #define __... Read more

POJ 3468 -- A Simple Problem with Integers

線段樹 A simple problem? 當真? (雖然是個模板題…) 解法 就是線段樹模板題,需要建出一棵支援區間修改、區間查詢的線段樹。 使用懶標記實現。 本題測資範圍較大,必須開 long long int。 還有使用 cin, cout 時, 請配合 ios::sync_with_stdio(false); cin.tie(0); 使用,以免 TLE 傳送門 POJ3468 程式碼 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 ... Read more