Just a Computer Graphics Studio & My Life

PhotoImapct產生風格實驗3

想強化到跟上次一樣的風格,只是使用的找非空洞點方法改為,以該像素為出發點,像球那樣子擴張來找非空洞點,公式如:

  • (x-a)^2+(y-b)^2+(z-c)^2=r^2

(a, b, c)若為空洞點,則跑三層迴圈x = 0~255, y = 0~255, z = 0~255,而r從1開始遞增直到找到非空洞點,r為包覆xyz的迴圈。

先說結果圖效果比先前的方法:往red、green、blue找非空洞點來的好,不過若以如此暴力法求解,將耗費相當多的時間才能跑玩52張測試影像(800×534),於是我改進演算法為動態規劃(Dynamic Programming),也就是原先為空洞點的像素P,一旦找到非空洞點的像素Q,則記錄其找到非空洞點的像素Q的資訊,下次若再遇到空洞點的像素P,即可直接對照映射表找到非空洞點的像素Q的資訊,而不需要再花費時間去重複求解找尋~

原本純粹暴力法跑52張測試影像需耗費1天的時間,改為動態規劃(Dynamic Programming)後變為約6小時即可跑完。不過跟之前的方法(往red、green、blue找非空洞點)相比,所花費的時間依然大非常多,原因在於先前的方法一旦遇到空洞點的像素P,該項素只跑1-255個迴圈,現今的方法則是跑四層迴圈x(0~255)y(0~255)z(0~255)r(1~?),由此看來雖然現今方法可以真正找到最接近P像素的Q像素,然而卻得花費可觀的時間來求解,當然求解的方法還可以改為排列組合(求解數學式難度高),並從像素P以其為圓心出發找最接近它的像素Q,不過以當前來說效果較為重要。

結果發現用45張訓練影像訓練出來的映射表,有著非常大的「空洞(黑色)」:

  • 總共像素個數:16777216 (256*256*256)
  • 空洞像素個數: 15999587
  • 非空洞像素個數: 777629
  • 非空洞像素個數/總共像素個數: 0.0463503

若再加上52張測試影像填補空洞,還是有著非常大的「空洞(黑色)」:

  • 總共像素個數:16777216 (256*256*256)
  • 空洞像素個數: 15876186
  • 非空洞像素個數: 901030
  • 非空洞像素個數/總共像素個數: 0.0537056

非空洞點也才從4.6%升為5.3%,看來所拍攝的此組(訓練影像組和測試影像組)相片色彩分佈並沒有很平均。

然而效果已經顯現得相當不錯,無論是衡量指標(PSNR和SSIM)或人眼判斷,並與先前實驗方法做比較(取blue這部份):

第一張相片

testing original (0)

得到色彩空間映射表來強化此測試影像

testing result2 (0)

空洞點,並找到非空洞點的顏色來填補

testing result3 (0)

原先為空洞點,但找到最近非空洞點,越白色的像素表示距離原像素越近,RGB以255-r*10表示

testing result (0)

程式跑出來的結果影像

testing modified (0)

由攝影師調整的風格影像

testing result (0)

比較往blue方向找最近不是空洞的色彩

PSNR

  • nearest:36.4423
  • blue:32.4075
  • green:30.5513
  • red:31.8375

SSIM

  • nearest:0.971561 0.977166 0.927295
  • blue:0.929093 0.93184 0.906427
  • green:0.922371 0.945063 0.905196
  • red:0.925562 0.938831 0.905481

第二張相片

testing original (35)

得到色彩空間映射表來強化此測試影像

testing result2 (35)

空洞點,並找到非空洞點的顏色來填補

testing result3 (35)

原先為空洞點,但找到最近非空洞點,越白色的像素表示距離原像素越近,RGB以255-r*10表示

testing result (35)

程式跑出來的結果影像

testing modified (35)

由攝影師調整的風格影像

testing result (35)

比較往blue方向找最近不是空洞的色彩

PSNR

  • nearest:34.8481
  • blue:33.6636
  • green:34.0595
  • red:34.2456

SSIM

  • nearest:0.954662 0.965626 0.926643
  • blue:0.936677 0.951538 0.920947
  • green:0.947643 0.95245 0.924064
  • red:0.949039 0.957135 0.923684

第三張相片

testing original (48)

得到色彩空間映射表來強化此測試影像

testing result2 (48)

空洞點,並找到非空洞點的顏色來填補

testing result3 (48)

原先為空洞點,但找到最近非空洞點,越白色的像素表示距離原像素越近,RGB以255-r*10表示

testing result (48)

程式跑出來的結果影像

testing modified (48)

由攝影師調整的風格影像

testing result (48)

比較往blue方向找最近不是空洞的色彩

PSNR

  • nearest:37.4628
  • blue:35.1127
  • green:35.4775
  • red:35.6436

SSIM

  • nearest:0.973975 0.970322 0.930648
  • blue:0.957476 0.95184 0.917948
  • green:0.963878 0.954456 0.92131
  • red:0.967695 0.956186 0.923605

以52張測試影像平均:

PSNR

  • nearest:38.73795385
  • blue:36.0381
  • green:35.97626346
  • red:35.92330385

SSIM

  • nearest:0.97541425 0.979422385 0.950393788
  • blue:0.961486385 0.964917731 0.940215346
  • green:0.961879942 0.965542577 0.940845577
  • red:0.962398577 0.965908154 0.941005192

最後我們想瞭空洞點像素P解找到非空洞像素的距離:

  • (x-a)^2+(y-b)^2+(z-c)^2=r^2

雖然公式如此寫,然而r^2會以1、4、9……這樣的值跳動,於是r^2我改為以1、2、3……設定,表示距離以根號1、根號2、根號3……跳動,如此便可找到最近的像素Q。

first set distance

此Distance須開根號,才能表示真實的距離

看來多數空洞像素P,可以在根號1、根號2、根號3內找到最近非空洞像素Q,當然也有必須找更遠的像素例子:

distance number
0 0
1 153097
2 183571
3 78505
4 9134
5 12200
6 4184
7 0
8 1230
9 1795
10 1320
11 545
12 256
13 390
14 489
15 0

列出距離在4(根號16)以內,發現某些距離(不只是2^n-1)會有0個的情況,表示找到的(x, y, z)無法符合該距離,畢竟已經用暴力法跑過全色彩空間。

以下是映射表(分為原始影像的映射表和強化影像的映射表),總共由45張訓練影像和52張測試影像產生,非空洞(黑色)的部份只有5.3%。映射圖已從4096*4096的PNG檔壓縮成1024*1024的JPG檔,為了節省空間(前約10M,後約0.2M)。

OriginalMap

原始影像的映射表

EnhanceMap

強化影像的映射表

放大看某區域部份色彩空間,擷取映射表(原始影像的映射表和強化影像的映射表)左上方512*512區塊且沒有壓縮為破壞性的JPG檔,依然是非破壞性壓縮的PNG檔,以查看非空洞點實際分佈情況。

OriginalMap 4 region

原始影像的映射表,其中四小塊

EnhanceMap 4 region

強化影像的映射表,其中四小塊

廣告

發表留言

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

標籤雲

%d 位部落客按了讚: