import math
import numpy as np
import numba
import cv2
[文档]@numba.jit
def Entropy(src):
"""Calculate the information entropy of source image.
The Entropy will calculate the information entropy of image
:param src: source image, it should be read by `cv2.imread()` and grayscale image
:return: information entropy
:rtype: float
"""
tmp = [0.0] * 256
for i in range(src.shape[0]):
for j in range(src.shape[1]):
tmp[src[i,j]] += 1
for i in range(256):
tmp[i] = tmp[i]/src.size
result = 0
for i in range(256):
if tmp[i] != 0:
result -= tmp[i] * (np.log2(tmp[i]))
return result
[文档]@numba.jit
def avg_grad(src):
"""Calculate the average gradient of source image
:param src: source image, it should be read by `cv2.imread()` and grayscale image
:return: average gradient
:rtype: float
"""
src = src.astype(np.float64)
tmp = 0.0
for i in range(src.shape[0]-1):
for j in range(src.shape[1]-1):
dx = src[i, j+1] - src[i, j]
dy = src[i+1, j] - src[i, j]
tmp += math.sqrt((dx**2 + dy**2)/2)
return tmp/(src.shape[0]*src.shape[1])
[文档]@numba.jit
def RMSE(src, pan):
"""Calculate RMSE of source image
:param src: source image, it should be read by `cv2.imread()` and grayscale image
:return: RMSE
:rtype: float
"""
src = src.astype(np.float64)
pan = pan.astype(np.float64)
tmp = 0.0
for i in range(src.shape[0]):
for j in range(src.shape[1]):
tmp += (src[i, j] - pan[i, j]) * (src[i, j] - pan[i, j])
return math.sqrt(tmp/(src.shape[0]*src.shape[1]))
[文档]def R_value(src, pan):
"""Calculate the R squared value
:param src: source image, it should be read by `cv2.imread()` and grayscale image
:return: R value
:rtype: float
"""
mean_src = cv2.mean(src)[0]
mean_pan = cv2.mean(pan)[0]
src = src.astype(np.float64)
pan = pan.astype(np.float64)
return _Rsqure(src, pan, mean_src, mean_pan)
@numba.jit
def _Rsqure(src, pan, src_mean, pan_mean):
fenzi = 0
fenmu1 = 0
fenmu2 = 0
for i in range(src.shape[0]):
for j in range(src.shape[1]):
fenzi += (src[i, j] - src_mean) * (pan[i, j] - pan_mean)
fenmu1 += (src[i, j] - src_mean) **2
fenmu2 += (pan[i, j] - pan_mean) **2
return fenzi / math.sqrt(fenmu1*fenmu2)
[文档]@numba.jit
def piancha_relativepiancha(src, pan):
src = src.astype(np.float64)
pan = pan.astype(np.float64)
piancha = 0
relativepiancha = 0
for i in range(src.shape[0]):
for j in range(src.shape[1]):
pixel = abs(src[i, j] - pan[i, j])
piancha += pixel
if pan[i, j] == 0:
continue
relativepiancha += pixel/pan[i, j]
return (piancha/(src.shape[0]*src.shape[1])), (relativepiancha/(src.shape[0]*src.shape[1]))
[文档]def scala_image(img, rg):
if rg[0] > rg[1]:
raise "range error"
b,g,r = cv2.split(img)
b = b.astype(np.float32)
g = g.astype(np.float32)
r = r.astype(np.float32)
min_b, max_b = np.min(b), np.max(b)
min_g, max_g = np.min(g), np.max(g)
min_r, max_r = np.min(r), np.max(r)
bs = ((b - min_b) / (max_b - min_b)) * (rg[1] - rg[0]) + rg[0]
gs = ((g - min_g) / (max_g - min_g)) * (rg[1] - rg[0]) + rg[0]
rs = ((r - min_r) / (max_r - min_r)) * (rg[1] - rg[0]) + rg[0]
bs = bs.astype(np.uint8)
gs = gs.astype(np.uint8)
rs = rs.astype(np.uint8)
return cv2.merge((bs, gs, rs))