Re: [問題] 該怎樣子找影像處理中縮圖的相關資料

看板C_and_CPP (C/C++)作者 (鬼翼&娃娃魚)時間16年前 (2009/06/07 13:39), 編輯推噓2(201)
留言3則, 2人參與, 最新討論串2/3 (看更多)
※ 引述《geminily (雙子個性的牛)》之銘言: : 大家午安: : 我最近有在trace 人家寫好的影像處理程式~ : 其中程式碼中有提到一些 將size 較大的影像,縮小的方法! : 這個程式碼中有提到三個方式~ : 分別是 : simple resize : color average resize : alpha resize : 由於code中沒有註解~我直接不太能從code中了解其程式攥寫的 : 目的~我有試著在 google 中 使用 縮圖 加上上面這兩個名稱 : 我都找不到關於這三個方式相關說明~ : 不曉得板上有沒有寫過相關影像處裡程式的朋友~ : 能夠指引一些方向~ 其實小弟我沒有直接研究過這些名詞, 不過以前做影像處理的經驗.... 至少前面兩種resize可能是下面這樣, 也應該是比較常見的方法了.... 假設有以下Gray Level Image: 01 02 03 04 05 06 07 08 03 04 05 06 07 08 09 10 05 06 07 08 09 10 11 12 07 08 09 10 11 12 13 14 把這張8 x 4的Image縮小成4 x 2的話.... 第一種可能是下面這樣.... 01 03 05 07 05 07 09 11 也就是直接算比例, 取最接近的row / column的pixel當縮小後的level.... == 第二種可能是下面這樣.... 02 04 06 08 06 08 10 12 先說這個不是只是單純換一個row / column取, 而是取四個點的平均.... 只是因為我設計的數字鳥鳥的, 都有0.5, 為了偷懶我全無條件捨去了.... 平均法可能還有一點差異, 也就是你到底要sample多少個點.... 因為我上面的例子只是單純width / height都除以2所以很簡單.... 如果除以3, 除以4, 甚至是縮放任意比例的時候, sample點就有差了.... 通常要快可以取相臨的四個點做雙線性內插法, 有點像3D fetch texel.... 以上面的例子, 是resize後會取到原圖(假設左上角為(0, 0)) (0.5, 0.5), (2.5, 0.5), (4.5, 0.5), ..., (6.5, 2.5)共八個pixel.... 如果今天需要取的比例不是剛好整除, 算出來可能像下面這樣(亂舉例的) (0.667, 0.667), (1.333, 0.667), (2.0, 0.667), .... 所以以第一個pixel來看.... 01 02 顯然02 03的比例應該要大一些.... 03 04 04的比例還會佔的比02 03更大.... 這個比例數學上都算得出來, 就可以代入雙線性內差法求值.... 相對於總是取相臨四個點, 也有用二次函數取九個點的算法的樣子.... 但是有一個最簡單的問題是, 只取臨近的幾個點的縮圖總是可能不夠.... 所以另外一種平均法, 也可以把範圍內所有pixel都拿進來取平均.... 同樣的example, 假如這次我要縮成2 x 1的大小.... 01 02 03 04 05 06 07 08 03 04 05 06 07 08 09 10 把16個值都拿來取平均.... 05 06 07 08 09 10 11 12 算出來的縮圖顯然會比只取四個還有鑑別性.... 07 08 09 10 11 12 13 14 這個例子可能看不出來是因為我數字取得差.... 取平均 取平均 那假如又不是剛剛好比例均等呢??(而且resize也不見得width和height比例要一樣) 考倒我了, 事實上這種case在3D要fetch texel的話, 已經會換一層mipmap取了XD == 第三種不清楚, 猜測是如果原圖是有alpha channel(通常代表透明度) 那就把alpha這一層的value也拿進來取加權平均, 不過目前還沒玩過就是了.... == 關於Color Average其實要仔細研究的話還存在一個問題.... 相對於gray level其實就只是單純的亮度來說, 彩色的怎樣辦?? 最簡單的例子是, (255, 0, 0)和(0, 0, 255)這兩個pixel取平均.... 結果應該是(255, 0, 255)??還是(127, 0, 127)??還是其他的?? 有人會考慮快速簡單, 那直接RGB各別channel都像gray level一樣做就好了.... 有人會考慮算出符合"人眼感受的色彩距離", 那也許要換個Color Space(La*b*) 萬一原先處理的Color Space就不是RGB了(像HSI/HSV, YCbCr)能否直接算?? 萬一原先處理的Color Space其實是sRGB或alpha-premultiplied的RGBA呢?? 最後這點其實是當初實驗室學長提出來的問題.... 加上前陣子在看OpenVG看到裡面一些Color Space.... 不過照一些影像處理的選項, Image Resize應該還是有些固定常用的演算法的.... 有興趣的話應該可以用那些關鍵字繼續去找其他的reference來看看吧我想.... 以上, 如果有漏誤的也請板上先進不吝指教....<(_ _)> -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 58.41.192.14

06/07 13:43, , 1F
第一種就是OpenGL的Nearest filter XD
06/07 13:43, 1F

06/07 13:44, , 2F
第二種比較像Box filter或者GL的Linear filter
06/07 13:44, 2F

06/07 17:08, , 3F
嗯 filters 就是在做這類的事, 學問很大呢 XDD
06/07 17:08, 3F
文章代碼(AID): #1AArAYl5 (C_and_CPP)
文章代碼(AID): #1AArAYl5 (C_and_CPP)