写个python程序计算psnr
时间: 2024-06-17 20:07:15 浏览: 166
PSNR是一种用于衡量图像压缩质量的指标,可以通过编写Python程序来计算PSNR。计算PSNR需要比较两张图片的像素值,并计算它们之间的均方误差(MSE)。下面是一个简单的Python代码示例:
```
import cv2
import numpy as np
def psnr(img1, img2):
mse = np.mean((img1 - img2) ** 2)
if mse == 0:
return 100
PIXEL_MAX = 255.0
return 20 * np.log10(PIXEL_MAX / np.sqrt(mse))
# 加载两张图片
img1 = cv2.imread("image1.jpg")
img2 = cv2.imread("image2.jpg")
# 计算PSNR值
psnr_value = psnr(img1, img2)
print("PSNR值为:", psnr_value)
```
在这个示例中,我们首先使用OpenCV库加载两张图片。然后,我们定义一个名为“psnr”的函数,该函数接受两个图像作为输入,并返回它们之间的PSNR值。最后,我们在主程序中调用“psnr”函数,并将结果打印出来。
相关问题
psnr python
PSNR是峰值信噪比(Peak Signal-to-Noise Ratio)的缩写,用于衡量图像质量的指标。计算PSNR的公式为:PSNR = 20 * log10(MAX / sqrt(MSE)),其中MAX表示像素值的最大可能取值(例如255),MSE表示均方误差(Mean Squared Error)。
根据引用提供的代码,你可以使用OpenCV和NumPy库来计算图像的PSNR。在这个代码示例中,首先将图像转换为YCbCr格式,然后只计算Y分量的PSNR。具体的实现步骤如下:
1. 导入必要的库:import cv2 as cv, import numpy as np, import math。
2. 定义一个名为psnr的函数,该函数接受两个图像作为输入参数,计算它们的PSNR,并返回结果。PSNR的计算公式为20 * log10(255 / sqrt(mse)),其中mse表示均方误差。
3. 定义一个名为main的函数,该函数是程序的入口点。
4. 在main函数中,使用cv.imread函数读取原始图像和压缩后的图像。
5. 调用psnr函数,传入这两个图像作为参数,并将结果赋值给变量res。
6. 使用print函数打印结果。
根据引用提供的代码,你也可以使用第三方库scikit-image来计算图像的PSNR。这个库中有一个名为peak_signal_noise_ratio的函数可以直接计算图像的PSNR。具体的实现步骤如下:
1. 导入必要的库:from skimage.metrics import peak_signal_noise_ratio as psnr, from PIL import Image, import numpy as np。
2. 使用Image.open函数打开原始图像和压缩后的图像,并使用np.array函数将它们转换为NumPy数组。
3. 调用psnr函数,传入这两个图像作为参数,并将结果打印出来。
根据引用提供的修改后的代码,你也可以使用PIL库和NumPy库来计算图像的PSNR。具体的实现步骤如下:
1. 导入必要的库:from PIL import Image, import numpy as np。
2. 使用Image.open函数打开原始图像和压缩后的图像,并使用np.array函数将它们转换为NumPy数组。同时,将数组的数据类型设置为float64。
3. 定义一个名为psnr的函数,该函数接受两个图像作为输入参数,计算它们的PSNR,并返回结果。PSNR的计算公式为20 * log10(255 / sqrt(mse)),其中mse表示均方误差。
4. 在main函数中,调用psnr函数,传入这两个图像作为参数,并将结果打印出来。
请帮我写一个opencv python 程序,计算图片经过均值滤波、中值滤波、自适应中值滤波、两次小波分解滤波后的MSE,P SNR值,从而评价这几个滤波处理的结果的好坏
在OpenCV中,计算图像处理后(如滤波)的MSE(均方误差)和PSNR(峰值信噪比)通常用于比较原始图像和处理后的图像质量。以下是使用Python和OpenCV来实现这个功能的一个简单示例,涵盖了你提到的几种滤波方法:
```python
import cv2
import numpy as np
from skimage.measure import compare_ssim
from scipy.fftpack import dct, idct
def calculate_mse(original_image, processed_image):
mse = np.mean((original_image - processed_image) ** 2)
return mse
def calculate_psnr(original_image, processed_image):
mse = calculate_mse(original_image, processed_image)
max_pixel_value = 255.0 # 对于8位灰度图像
psnr = 10 * np.log10(max_pixel_value**2 / mse)
return psnr
# 假设你已经有了原始图像和滤波后的图像
original_image = cv2.imread('original.jpg', 0) # 读取灰度图像
processed_images = {
"mean": cv2.blur(original_image, (3, 3)), # 均值滤波
"median": cv2.medianBlur(original_image, 5), # 中值滤波
"adaptive_median": cv2.adaptiveMedianFilter(original_image, (5, 5), cv2.ADAPTIVE_THRESH_GAUSSIAN_C), # 自适应中值滤波
"wavelet": np.abs(dct(dct(original_image, norm="ortho", axis=-1), norm="ortho", axis=-2)), # 二次小波分解滤波
}
mse_values = []
psnr_values = []
for name, filtered_image in processed_images.items():
mse = calculate_mse(original_image, filtered_image)
psnr = calculate_psnr(original_image, filtered_image)
mse_values.append(mse)
psnr_values.append(psnr)
print(f"{name} MSE: {mse:.4f}, PSNR: {psnr:.4f}")
# 结果总结
print("\nOverall comparison:")
for i, (method, (mse, psnr)) in enumerate(zip(processed_images.keys(), zip(mse_values, psnr_values))):
print(f"{i+1}. {method}: MSE = {mse:.4f}, PSNR = {psnr:.4f}")
# 如果需要,可以使用skimage.metrics.structural_similarity()计算SSIM作为额外的评估指标
ssim_values = [compare_ssim(original_image, filtered_image, multichannel=True) for filtered_image in processed_images.values()]
print("SSIM values:", ssim_values)
```
这个程序首先定义了计算MSE和PSNR的方法,然后读取原始图像并应用各种滤波操作。最后,它计算每种滤波方法下的MSE和PSNR值,并输出对比结果。
阅读全文