Peter's codebook A blog full of codes

ZeroJudge b451 -- 圖片匹配

圖片匹配,給兩張圖片 A, B ,問 B 要對齊 A 的哪個位置, 可以使得 A, B 之間像素差平方的和最小? 根據題目敘述,可以知道 因為 在哪裡都一樣,只要算 和 的部分就可以了。 可以用二維 prefix sum 求到, 需要利用 FFT + 卷積。 並求出最小的 diff 傳送門 ZJ_b451 ZOJ1637 兩題一樣, FFT 程式碼就是借用 ZOJ 的。 ZeroJudge b451 程式碼 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... Read more

材質轉換

簡單來說,就是一種將材質(紋理)轉換到目標圖片上的效果。 結果 原始材質: 放上方表原圖,放下方代表結果。 Lenna 圖: Miku: (慢慢強化效果) 一些實作細節 可以想像成,在材質中找很多固定大小的小方塊,由左而右、由上而下嘗試拼出原始圖片的樣式。 要決定要使用哪個小方塊,我的做法是計算方塊範圍內的 “亮度總和” ,與要貼上的原始圖片範圍內的亮度總和相減、取絕對值,找到一個差異最小的方塊貼上即可。 這樣做的好處是,可以使用二維的 prefix sum ,快速 得出矩形區域內的亮度總和,使得整隻程式跑起來不會太慢,又可以達成不錯的效果。 來定義一下亮度吧,一個像素的亮度就以它的 來表示。(雖然與視覺上的亮度定義不相同,但是比較... Read more

關於 Shared library

Shared library 是很方便的東西, 除了 library 本身可重複利用外, 因為主程式是在執行時,才將 library link 進來, 也可以減少主程式佔的硬碟空間。 另外一個好處,如果主程式需要修改,但 shared library 不用, 那麼只需要重新編譯主程式就好了,省去重新編譯 library 的時間。 建造一個 shared library 首先,先編譯好我們需要的物件檔 (object file): g++ -c -fPIC alice.cpp bob.cpp -fPIC: 告訴編譯器產生無關位置程式碼 (Position-Independent Code) ,這樣在 shared library 被載入時,程式碼在記憶體中的位置是不固... Read more

漸層色彩 -- ZeroJudge b427

就是線性內插,很直觀。 結果 平行: 放射狀: Before: After: Before: After: ZJ 題目傳送門 漸層色彩 主要程式碼 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 68 69 70 71 72 73 74 75 76 77 78 79 80 #ifndef __INCLUDE_L... Read more

Seam Carving -- ZeroJudge b438

這次來實作一下上上學期多媒體技術導論, 聽過的 Seam Carving 方法吧。 Seam Carving 簡單來說,就是在影像中,由上到下(或左到右),找到一條能量總和最小的路徑,然後把它刪掉, 刪掉一次,影像寬度(或高度)會少 1 ,以此達到影像縮放的功能,這種方法不會太大影響影像中的物件比例。 為什麼這種方法比較不會影響影像中的物件比例呢?因為像素是用「移除」的,並且能量(梯度)較低的像素,比較不會出現在邊緣上,我們也比較難查覺出,有些像素被移除了。 考慮到計算複雜度問題,要一次找出 n 條不重疊、能量加總最小的路徑太花時間, 只好採用一點 greedy 的策略,每次只刪去目前能量最小的 1 個路徑,做 n 回合,來達成圖片縮放的功能。 要算出一條能量總和最小的路... Read more