2014年3月12日 星期三

Digital Image Processing#1 - 圖片縮放(Scale). 旋轉(Rotate) 與 內插演算法(Interpolation)

文章流程
  • 對蕾娜的品頭論足 
  • 實作參考 與 連結
  • 可省略的個人雜談


對蕾娜的品頭論足

以下lena縮放解析度為5000 * 3000,擷取眼睛周圍512 * 512區域

當個創世神的Nearest-neighbor interpolation

肉眼可清楚地看出瑕疵,交界處有明顯的鋸齒,皮膚成塊狀色塊,睫毛幾乎失去原本形狀

朦朧美的Bilinear interpolation

比起Nearest,整體輪廓分明,沒有明顯鋸齒,皮膚表現也不錯,大概化妝的29歲
但是,整體有種朦朧感,猶如罩了一層薄紗,與Bicubic交替看時,感受尤其明顯

低速高質的Bicubic interpolation

比起Bilinear,睫毛形狀更加清晰,陰影也比較分明,皮膚能看出毛孔與顆粒紋路
整體分明,輪廓深邃真實,與Bilinear交替看時,清晰感十分明顯

以中心做旋轉 - 在後仰的蕾娜

實際上旋轉時,能同時縮放,但作業無此需求,故實作是用Nearest
縱使沒有寫成平行化,迭代的寫法也足夠快,即時顯示出結果
背景部分設成黑色,在某些角度時,能看出圖片邊緣有些鋸齒

實作參考 與 連結

程式實作是參考大陸博客,博主將OpenCV源碼,從平行化改成跌代,方便理解演算法
我找了很多資料,與實際觀看OpenCV源碼,來理解程式與演算法
在原程式碼旁,加入理解過的註釋,以下列出篩選過的重要參考:

程式碼實作參考

如何觀看opencv源碼?

演算法理解 (概念 / 公式)

interpolation概念

Nearest

  • 直接看源碼就懂
  • 有個疑問是: 取整時,用cvFloor還是cvRound,需不需要+0.5? (四捨五入)
    • 目前猜測是都可以(無條件捨去 或者 四捨五入),看個人取向

Bilinear

Bicubic (Bicubic convolution algorithm)

Rotate

補充資料: 關於Mat Class 與 指針操作

可省略的個人雜談

Bilinear與Bicubic,對蕾娜來說,大概要縮放到5000 * 3000以上,

才會在交界處,明顯看出鋸齒多寡的差異

但是,如果頻繁地切換兩張圖片 來 對比,則能明顯看出一邊模糊一邊清晰

Bicubic迭代十分耗時,縮放到5000 * 3000時,耗了將近1分多鐘

熟悉演算法後,大概會嘗試寫成平行化,來加速運算


好奇的小問題,蕾娜有正面圖嗎 ... ? 我看了覺得脖子好痠

沒有留言:

張貼留言