b426: 宇宙光明體
Tags : 影像處理
Accepted rate : 18人/19人 ( 95% ) [非即時]
評分方式:
Tolerant

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

Content



不是人人都會分身,也不是人人都看得見分身。不過呢,寫程式讓一張圖片出現分身,這就容易得多。只要你這題能獲得AC,就有機會了!



首先讓我講解一下圖片合成的基本原理。

圖片只有RGB值的情況

foreground是前景(添加圖片)。background是背景(原始圖片)。前景覆蓋於背景之上。

兩張圖片相疊,一定比例保留前景顏色,剩餘比例當作背景顏色,如此才能達成半透明效果。寫成數學公式就是:

Rfore * OPACITY + Rback * (1.0 - OPACITY) = Rnew

此處以R值為例。RGB皆如此。計算結果四捨五入,滿足RGB數值範圍。

OPACITY是前景札實程度(不透明度)。OPACITY是一個比例數值,介於0與1之間。OPACITY是1,完全是前景(完全不透明);OPACITY是0,完全是背景(完全透明)。OPACITY的大小,決定了最終結果是偏前景、還是偏背景。

這個觀念即是國中數學的內分點、高中數學的線性內插。



圖片擁有RGBA值的情況

不是本題要處理的情況,只是順便說明:

1. 調整A值的範圍:從整數[0, 255],改為浮點數[0.0, 1.0]。
2. 計算背景顏色,考慮背景A值:Rback * Aback
3. 計算合成顏色,考慮前景A值:Rfore * Afore + (Rback * Aback) * (1 - Afore) = Rnew
4. 計算合成後的A值:Afore + Aback - Afore * Aback = Anew
5. 考慮合成後的A值,調整合成顏色:Rnew / Anew = Rtrue
6. 還原A值的範圍。
7. 計算結果四捨五入。小於0請設定為0,大於255請設定為255,滿足RGBA數值範圍。
8. 小心處理 Anew 等於0的情況。

原理講解完畢。

現在給你一張前景(添加圖片),一張背景(原始圖片),請將前景覆蓋於背景之上。指令格式如下:

X Y OPACITY

前景的左上角像素,對準背景的座標(X,Y)。座標(0,0)是左上角像素,座標(W-1,H-1)是右下角像素,W H是圖片寬高。前景可以超出背景範圍,超出部分不處理。

指令範例:0 0 0,前景的左上角,對齊背景的左上角。

Input

首先是一道指令:兩個整數 X Y (-10,000 <= X Y <= +10,000),一個浮點數 OPACITY (0.0 <= OPACITY <= 1.0)。

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

然後是一張背景(原始圖片):格式同上。

Output

請輸出處理後的圖片。

 

Sample Input #1
0 0 0.5
1 1
255 255 255
1 1
0 0 0
Sample Output #1
1 1
128 128 128
測資資訊:
記憶體限制: 64 MB
公開 測資點#0 (16%): 1.0s , <1M
公開 測資點#1 (16%): 1.0s , <1M
公開 測資點#2 (16%): 1.0s , <1M
公開 測資點#3 (16%): 1.0s , <1M
公開 測資點#4 (16%): 1.0s , <1M
公開 測資點#5 (20%): 1.0s , <1M
Hint :

1. 學術上,這稱做Image Compositing,圖片合成。圖片合成有許多演算法,本題採用了最簡易的演算法 Alpha Compositing。Alpha Compositing的效果是半透明鬼影。因為效果太假了,所以大家鮮少使用此演算法,頂多用於視覺特效,例如過場效果。

2. 想要改善效果,有各式各樣的方式。例如去背處理「b423: 魔術橡皮擦」,例如漸層處理「b427: 漸層色彩」,例如模糊化處理「b425: 抽菸動作 請勿模仿」,例如添加亂數誤差。有興趣的人可以自己組裝這些演算法。

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


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