超解析度中PSNR的計算與bicubic插值

2021-10-05 19:25:13 字數 1410 閱讀 6214

正確計算psnr對於做超解析度研究是很重要的,因為psnr是被廣泛使用的metric之一。同時bicubic插值演算法也很重要,因為目前主流的有監督超解析度演算法中,需要構成hr-lr訓練對,而這個對的構成方法需要使用到bicubic插值。psnr的定義很簡單,

m se

=1h×

w∑i=

1h∑j

=1w(

x(i,

j)−y

(i,j

))

2m s e=\frac \sum_^ \sum_^(x(i, j)-y(i, j))^

mse=h×

w1​i

=1∑h

​j=1

∑w​(

x(i,

j)−y

(i,j

))2psn

r=

10log⁡10

(2552

mse)

p s n r=10 \log _\left(\frac}\right)

psnr=1

0log10

​(ms

e255

2​)其中x和y分別是gt和待測,值域為[0,255]。

但是當真正在python上用這個公式計算bicubic的psnr時(因為bicubic的結果是能精確復現的,其他深度學習的演算法不一定能精確復現),會發現計算出來的結果經常會有很大偏差。這是因為這2個原因:

2、使用的計算方法不正確,包括轉換y通道的時機和計算中間量的資料型別。

我研究的結果是參考srcnn的matlab**實驗證明matlab**是可以獲得33.66這個結果的,並且在python上覆現了計算psnr的**,驗證後與matlab計算的結果一致(33.65,這是因為用bicubic插值得到的中間影象,是計算不出33.66的(在python和matlab上都不行),具體看流程圖就很好理解了)

這裡要感謝的工作,這份工作成功在python上覆現了matlab版本的bicubic插值演算法(別的是否一致我不確定)。但是我的實驗表明,double版本的插值完全一致,但uint8版本的插值有些區別,不過正常計算psnr的流程中不需要uint8版本的插值,也就沒有影響了。

我的**放在如有需要可以取用。

2020.12.21

最近的工作發現,matlab的imsize之前有些問題是沒法確定的,比如是轉成float16還是float32,除不除255,這些沒法確定。誠然,這些操作會影響最後的計算結果,但是影響實在太小(不到0.01db)導致沒法確認採用哪個,所以索性喜歡用哪個就用哪個吧。srcnn裡是除255,轉float16做的。

另外,還有個很奇怪的事。div2k官方提供的bicubic_4x資料集,它確實是用matlab上的imresize做出來的,但是它並沒有轉float16或float32,而是直接用uint8算的!(我對了各種做法輸出的影象的總大小,只有這樣做最終的結果才是一致的)

顯示卡與解析度的關係

一 顯示卡有三個引數 處理能力 由顯示卡決定 輸出解析度 輸出重新整理率,這三者的關係式為 處理能力 輸出解析度 輸出重新整理 率。二 電腦中所顯示的畫面,都是由顯示卡來進行輸出的,因此螢幕上每個畫素的填充都得由顯示卡來進行計算 輸出。fps fps是影象 領域中的定義,即每秒傳輸幀數。fps也可以...

AD的精度與解析度

簡單點說,精度 是用來描述物理量的準確程度的,而 解析度 是用來描述刻度劃分的。從定義上看,這兩個量應該是風馬牛不相及的。是不是有朋友感到愕然 很多賣感測器的js就是利用這一點來糊弄人的了。簡單做個比喻 有這麼一把常見的塑料尺 中學生用的那種 它的量程是10厘公尺,上面有100個刻度,最小能讀出1公...

解析度與精度的區別

很多人對於精度和解析度的概念不清楚,這裡我做一下總結,希望大家不要混淆。我們搞編碼器製做和銷售的,經常跟 精度 與 解析度 打交道,這個問題不是三言兩語能搞得清楚的,在這裡只作拋磚引玉了。簡單點說,精度 是用來描述物理量的準確程度的,而 解析度 是用來描述刻度劃分的。從定義上看,這兩個量應該是風馬牛...