想強化到跟上次一樣的風格,只是使用的找非空洞點方法改為,以該像素為出發點,像球那樣子擴張來找非空洞點,公式如:
- (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這部份):
第一張相片
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
第二張相片
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
第三張相片
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。
看來多數空洞像素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)。
放大看某區域部份色彩空間,擷取映射表(原始影像的映射表和強化影像的映射表)左上方512*512區塊且沒有壓縮為破壞性的JPG檔,依然是非破壞性壓縮的PNG檔,以查看非空洞點實際分佈情況。
隨意留個言吧:)~