updates
parent
39f830d6e5
commit
e8eed1ad73
@ -0,0 +1,34 @@
|
|||||||
|
import cv2
|
||||||
|
import numpy as np
|
||||||
|
from scipy import signal
|
||||||
|
import torch
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
PIL_CONVERT_COLOR = {
|
||||||
|
'RGB': lambda pil_image: pil_image.convert("RGB") if pil_image.mode != 'RGB' else pil_image,
|
||||||
|
'full_YCbCr': lambda pil_image: pil_image.convert("YCbCr") if pil_image.mode != 'YCbCr' else pil_image,
|
||||||
|
'full_Y': lambda pil_image: pil_image.convert("YCbCr").getchannel(0) if pil_image.mode != 'YCbCr' else pil_image.getchannel(0),
|
||||||
|
'sdtv_Y': lambda pil_image: _rgb2ycbcr(np.array(pil_image))[:,:,0] if pil_image.mode == 'RGB' else NotImplementedError(f"{pil_image.mode} to Y"),
|
||||||
|
'L': lambda pil_image: pil_image.convert("L") if pil_image.mode != 'L' else pil_image,
|
||||||
|
}
|
||||||
|
|
||||||
|
def _rgb2ycbcr(img, maxVal=255):
|
||||||
|
O = np.array([[16],
|
||||||
|
[128],
|
||||||
|
[128]])
|
||||||
|
T = np.array([[0.256788235294118, 0.504129411764706, 0.097905882352941],
|
||||||
|
[-0.148223529411765, -0.290992156862745, 0.439215686274510],
|
||||||
|
[0.439215686274510, -0.367788235294118, -0.071427450980392]])
|
||||||
|
|
||||||
|
if maxVal == 1:
|
||||||
|
O = O / 255.0
|
||||||
|
|
||||||
|
t = np.reshape(img, (img.shape[0] * img.shape[1], img.shape[2]))
|
||||||
|
t = np.dot(t, np.transpose(T))
|
||||||
|
t[:, 0] += O[0]
|
||||||
|
t[:, 1] += O[1]
|
||||||
|
t[:, 2] += O[2]
|
||||||
|
ycbcr = np.reshape(t, [img.shape[0], img.shape[1], img.shape[2]])
|
||||||
|
|
||||||
|
return ycbcr
|
@ -0,0 +1,46 @@
|
|||||||
|
import cv2
|
||||||
|
import numpy as np
|
||||||
|
from scipy import signal
|
||||||
|
import torch
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def PSNR(y_true, y_pred, shave_border=4):
|
||||||
|
target_data = np.array(y_true, dtype=np.float32)
|
||||||
|
ref_data = np.array(y_pred, dtype=np.float32)
|
||||||
|
|
||||||
|
diff = ref_data - target_data
|
||||||
|
if shave_border > 0:
|
||||||
|
diff = diff[shave_border:-shave_border, shave_border:-shave_border]
|
||||||
|
rmse = np.sqrt(np.mean(np.power(diff, 2)))
|
||||||
|
|
||||||
|
return 20 * np.log10(255. / rmse)
|
||||||
|
|
||||||
|
|
||||||
|
def cal_ssim(img1, img2):
|
||||||
|
K = [0.01, 0.03]
|
||||||
|
L = 255
|
||||||
|
kernelX = cv2.getGaussianKernel(11, 1.5)
|
||||||
|
window = kernelX * kernelX.T
|
||||||
|
|
||||||
|
M, N = np.shape(img1)
|
||||||
|
|
||||||
|
C1 = (K[0] * L) ** 2
|
||||||
|
C2 = (K[1] * L) ** 2
|
||||||
|
img1 = np.float64(img1)
|
||||||
|
img2 = np.float64(img2)
|
||||||
|
|
||||||
|
mu1 = signal.convolve2d(img1, window, 'valid')
|
||||||
|
mu2 = signal.convolve2d(img2, window, 'valid')
|
||||||
|
|
||||||
|
mu1_sq = mu1 * mu1
|
||||||
|
mu2_sq = mu2 * mu2
|
||||||
|
mu1_mu2 = mu1 * mu2
|
||||||
|
|
||||||
|
sigma1_sq = signal.convolve2d(img1 * img1, window, 'valid') - mu1_sq
|
||||||
|
sigma2_sq = signal.convolve2d(img2 * img2, window, 'valid') - mu2_sq
|
||||||
|
sigma12 = signal.convolve2d(img1 * img2, window, 'valid') - mu1_mu2
|
||||||
|
|
||||||
|
ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) * (sigma1_sq + sigma2_sq + C2))
|
||||||
|
mssim = np.mean(ssim_map)
|
||||||
|
return mssim
|
Loading…
Reference in New Issue