图像评价指标(python)

代码:

import cv2
import numpy as np
import math

tmp = []
for i in range(256):
    tmp.append(0)
val = 0
k = 0
res = 0
#'img/1-3.jpg'=6.0404 ;  out2.jpg=7.0361 ;result2=7.1585
image = cv2.imread('img/result2.jpg',0)
img = np.array(image)
for i in range(len(img)):
    for j in range(len(img[i])):
        val = img[i][j]
        tmp[val] = float(tmp[val] + 1)
        k = float(k + 1)
for i in range(len(tmp)):
    tmp[i] = float(tmp[i]/ k)
for i in range(len(tmp)):
    if(tmp[i] == 0):
        res = res
    else:
        res = float(res - tmp[i] * (math.log(tmp[i]) / math.log(2.0)))
print (res)

二、均值和标准差

均值代表图像的亮度,越大代表越亮,但是不能单纯的说图像越亮越好,要视情况而定;

标准差则用于评价图像的对比度,越大表明图像明暗渐变层越多,图像细节越突出越清晰,不失为一种好的评价指标。

代码:

from PIL import Image,ImageStat
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('img/1-3.jpg')
img = img.astype(np.float32) / 255
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

plt.imshow(img)

cv2.imshow('img',img)
通过img.copy()方法,复制img的数据到mean_img
mean_img = img.copy()
使用 .mean() 方法可得出 mean_img 的平均值
print(mean_img.mean())
mean_img -= mean_img.mean() 等效于 mean_img = mean_img - mean_img.mean()
减去平均值,得出零平均值矩阵
mean_img -= mean_img.mean()
显示图像
cv2.imshow(mean_img)
cv2.imshow('mean_img',mean_img)

std_img = mean_img.copy()
输出 std_img 的标准差
print(std_img.std())

std_img /= std_img.mean() 等效于 std_img = std_img / std_img.mean()
除于标准差,得出单位方差矩阵
std_img /= std_img.std()
显示图像
plt.imshow(std_img)
cv2.imshow('std_img',std_img)

cv2.waitKey(0)
cv2.destroyAllWindows()

三、信噪比(峰值信噪比)

PSNR峰值信噪比(python代码实现+SSIM+MSIM)_彩色海绵的博客-CSDN博客_psnr峰值信噪比

代码:

import cv2 as cv
import math
import numpy as np

def psnr1(img1, img2):
    # compute mse
    # mse = np.mean((img1-img2)**2)
    mse = np.mean((img1 / 1.0 - img2 / 1.0) ** 2)
    # compute psnr
    if mse < 1e-10:
        return 100
    psnr1 = 20 * math.log10(255 / math.sqrt(mse))
    return psnr1

def psnr2(img1, img2):#&#x7B2C;&#x4E8C;&#x79CD;&#x6CD5;&#xFF1A;&#x5F52;&#x4E00;&#x5316;
    mse = np.mean((img1 / 255.0 - img2 / 255.0) ** 2)
    if mse < 1e-10:
        return 100
    PIXEL_MAX = 1
    psnr2 = 20 * math.log10(PIXEL_MAX / math.sqrt(mse))
    return psnr2

imag1 = cv.imread("./img/22.jpg")
print(imag1.shape)
imag2 = cv.imread("./img/222.jpg")
print(imag2.shape)
#&#x5982;&#x679C;&#x5927;&#x5C0F;&#x4E0D;&#x540C;&#x53EF;&#x4EE5;&#x5F3A;&#x5236;&#x6539;&#x53D8;
imag2 = imag2.reshape(352,352,3)
#print(imag2.shape)
res1 = psnr1(imag1, imag2)
print("res1:", res1)
res2 = psnr2(imag1, imag2)
print("res2:", res2)

#tensorflow&#x6846;&#x67B6;&#x91CC;&#x6709;&#x76F4;&#x63A5;&#x5173;&#x4E8E;psnr&#x8BA1;&#x7B97;&#x7684;&#x51FD;&#x6570;&#xFF0C;&#x76F4;&#x63A5;&#x8C03;&#x7528;&#x5C31;&#x884C;&#x4E86;&#xFF1A;(&#x66F4;&#x63A8;&#x8350;)&#x4EE5;&#x4E0B;&#x4EE3;&#x7801;
'''
#&#x6CE8;&#x610F;&#xFF1A;&#x8BA1;&#x7B97;PSNR&#x7684;&#x65F6;&#x5019;&#x5FC5;&#x987B;&#x6EE1;&#x8DB3;&#x4E24;&#x5F20;&#x56FE;&#x50CF;&#x7684;size&#x8981;&#x5B8C;&#x5168;&#x4E00;&#x6837;&#xFF01;
#compute PSNR with tensorflow

import tensorflow as tf

def read_img(path):
    return tf.image.decode_image(tf.read_file(path))

def psnr(tf_img1, tf_img2):
    return tf.image.psnr(tf_img1, tf_img2, max_val=255)

def _main():
    t1 = read_img('t1.jpg')
    t2 = read_img('t2.jpg')
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        y = sess.run(psnr(t1, t2))
        print(y)

if __name__ == '__main__':
    _main()
'''

四、平均梯度

图像评价指标(python)

平均梯度(meangradient):指图像的边界或影线两侧附近灰度有明显差异,即灰度变化率大,这种变化率的大小可用来表示图像清晰度。它反映了图像微小细节反差变化的速率,即图像多维方向上密度变化的速率,表征图像的相对清晰程度。

平均梯度即图像的清晰度(definition),反映图像对细节对比的表达能力,计算公式

图像梯度: G(x,y) = dx i + dy j;

dx(i,j) = I(i+1,j) – I(i,j);

dy(i,j) = I(i,j+1) – I(i,j);

其中,I是图像像素的值(如:RGB值),(i,j)为像素的坐标

图像梯度一般也可以用中值差分:

dx(i,j) = [I(i+1,j) – I(i-1,j)]/2;

dy(i,j) = [I(i,j+1) – I(i,j-1)]/2;

图像边缘一般都是通过对图像进行梯度运算来实现的。

上面说的是简单的梯度定义,其实还有更多更复杂的梯度公式。

python opencv学习(六)图像梯度计算_刘子晞的博客的博客-CSDN博客_图像计算梯度

代码:

import cv2 as cv

import numpy as np

'''&#x56FE;&#x50CF;&#x68AF;&#x5EA6;(&#x7531;x,y&#x65B9;&#x5411;&#x4E0A;&#x7684;&#x504F;&#x5BFC;&#x6570;&#x548C;&#x504F;&#x79FB;&#x6784;&#x6210;)&#xFF0C;&#x6709;&#x4E00;&#x9636;&#x5BFC;&#x6570;(sobel&#x7B97;&#x5B50;)&#x548C;&#x4E8C;&#x9636;&#x5BFC;&#x6570;(Laplace&#x7B97;&#x5B50;)

&#x7528;&#x4E8E;&#x6C42;&#x89E3;&#x56FE;&#x50CF;&#x8FB9;&#x7F18;&#xFF0C;&#x4E00;&#x9636;&#x7684;&#x6781;&#x5927;&#x503C;&#xFF0C;&#x4E8C;&#x9636;&#x7684;&#x96F6;&#x70B9;

&#x4E00;&#x9636;&#x504F;&#x5BFC;&#x5728;&#x56FE;&#x50CF;&#x4E2D;&#x4E3A;&#x4E00;&#x9636;&#x5DEE;&#x5206;&#xFF0C;&#x518D;&#x53D8;&#x6210;&#x7B97;&#x5B50;(&#x5373;&#x6743;&#x503C;)&#x4E0E;&#x56FE;&#x50CF;&#x50CF;&#x7D20;&#x503C;&#x4E58;&#x79EF;&#x76F8;&#x52A0;&#xFF0C;&#x4E8C;&#x9636;&#x540C;&#x7406;
'''

def sobel_demo(image):
    grad_x = cv.Sobel(image, cv.CV_32F, 1, 0)  # &#x91C7;&#x7528;Scharr&#x8FB9;&#x7F18;&#x66F4;&#x7A81;&#x51FA;

    grad_y = cv.Sobel(image, cv.CV_32F, 0, 1)

    gradx = cv.convertScaleAbs(grad_x)  # &#x7531;&#x4E8E;&#x7B97;&#x5B8C;&#x7684;&#x56FE;&#x50CF;&#x6709;&#x6B63;&#x6709;&#x8D1F;&#xFF0C;&#x6240;&#x4EE5;&#x5BF9;&#x5176;&#x53D6;&#x7EDD;&#x5BF9;&#x503C;

    grady = cv.convertScaleAbs(grad_y)

    #&#x8BA1;&#x7B97;&#x4E24;&#x4E2A;&#x56FE;&#x50CF;&#x7684;&#x6743;&#x503C;&#x548C;&#xFF0C;dst = src1alpha + src2beta + gamma

    gradxy = cv.addWeighted(gradx, 0.5, grady, 0.5, 0)

    cv.imshow("gradx", gradx)

    cv.imshow("grady", grady)

    cv.imshow("gradient", gradxy)

def laplace_demo(image): # &#x4E8C;&#x9636;&#x5BFC;&#x6570;&#xFF0C;&#x8FB9;&#x7F18;&#x66F4;&#x7EC6;
    dst = cv.Laplacian(image, cv.CV_32F)

    lpls = cv.convertScaleAbs(dst)

    cv.imshow("laplace_demo", lpls)

def custom_laplace(image):
    #&#x4EE5;&#x4E0B;&#x7B97;&#x5B50;&#x4E0E;&#x4E0A;&#x9762;&#x7684;Laplace_demo()&#x662F;&#x4E00;&#x6837;&#x7684;&#xFF0C;&#x589E;&#x5F3A;&#x91C7;&#x7528;np.array([[1, 1, 1], [1, -8, 1], [1, 1, 1]])kernel = np.array([[1, 1, 1], [1, -8, 1], [1, 1, 1]])

    dst = cv.filter2D(image, cv.CV_32F, kernel=kernel)

    lpls = cv.convertScaleAbs(dst)

    cv.imshow("custom_laplace", lpls)

def Scharr(img):

    scharrx = cv.Scharr(img,cv.CV_64F, dx= 1, dy= 0)
    scharrx = cv.convertScaleAbs(scharrx)

    scharry = cv.Scharr(img,cv.CV_64F, dx = 0, dy = 1)
    scharry = cv.convertScaleAbs(scharry)

    result = cv.addWeighted(scharrx, 0.5, scharry, 0.5, 0)

    cv.imshow("scharrx", scharrx)
    cv.imshow("scharry", scharry)
    cv.imshow("result", result)

src = cv.imread("img/result2.jpg")

cv.imshow("original", src)

sobel_demo(src)

laplace_demo(src)

custom_laplace(src)
Scharr(src)

cv.waitKey(0)  # &#x7B49;&#x6709;&#x952E;&#x8F93;&#x5165;&#x6216;&#x8005;1000ms&#x540E;&#x81EA;&#x52A8;&#x5C06;&#x7A97;&#x53E3;&#x6D88;&#x9664;&#xFF0C;0&#x8868;&#x793A;&#x53EA;&#x7528;&#x952E;&#x8F93;&#x5165;&#x7ED3;&#x675F;&#x7A97;&#x53E3;

cv.destroyAllWindows()  # &#x5173;&#x95ED;&#x6240;&#x6709;&#x7A97;&#x53E3;

图像评价指标(python)

五、SSIM

结构相似性指标(英文:structural similarity index,SSIM index),是一种用以衡量两张数字图象相似性的指标。结构相似性在于衡量数字图像相邻像素的关联性,图像中相邻像素的关联性反映了实际场景中物体的结构信息。因此,在设计图像失真的衡量指标时,必须考虑结构性失真。

图像相似性评价指标SSIM/PSNR_恒友成的博客-CSDN博客_ssim指标

Original: https://blog.csdn.net/m0_63172128/article/details/125856799
Author: 彩色海绵
Title: 图像评价指标(python)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/670254/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球