如何在Python中从两个不同大小的图像中找到PSNR

问题描述 投票:0回答:1

我有两张图像,一张是原始图像,另一张是通过一些处理从原始图像重建的。我想找到重建图像的 PSNR 原始图像的大小为

(180, 180)
,但重建图像的大小为
(71,81)
。我正在使用 cv2.reshape() 重塑重建图像。

shape = 180
reconstructed = cv2.resize(reconstructed, (shape,shape))
reconstructed = cv2.normalize(reconstructed, None, alpha=0, beta = 255, norm_type= cv2.NORM_MINMAX, dtype=cv2.CV_32F)
original = cv2.normalize(original, None, alpha=0, beta = 255, norm_type= cv2.NORM_MINMAX, dtype=cv2.CV_32F)
MSE = np.mean((original - reconstructed)**2)
PSNR = 10*np.log10(255**2/MSE)
print(PSNR)

由于尺寸不匹配并且我必须计算 PSNR,我担心可能存在一些对齐问题,因此可能会给出错误的 PSNR。如何才能准确计算 PSNR?

python arrays image image-processing
1个回答
0
投票

脚手架

首先,如果下次您能提供数据就太好了。或者至少有一些方法可以生成您认为与您的数据足够接近的东西,这样答案实际上对您有用。

因为我们一直缺少这一点,所以我构建了一些小脚手架来生成原始图像和重建图像,可以在其中设置噪声级别。

调整大小而不是重塑形状

那是不碍事的。你想调整大小。由于大小不同,reshape 要求数组中元素的总数保持相同。如果在不保持元素总数不变的情况下重塑数组,则会导致表示扭曲或错误(这可能是重塑时出现错误的原因)。使用

cv2.resize
调整大小更适合这种情况,因为它会插入像素值以适应新尺寸,确保调整后的图像能够以不同尺寸有意义地表示原始图像。

处理对齐问题

现在您实际上获得了 PSNR 值,您可以开始考虑在调整大小期间如何对重建图像进行插值。这取决于您的数据,调整大小方法为您提供了 5 个选项可供选择 - 阅读 docs。如果您不知道选择哪个,请进行实验来找出答案。

我的代码适合任何想要玩或在其基础上构建以获得另一个答案的人。

import numpy as np
import cv2

def generate_dummy_image(size):
    return np.random.randint(0, 1, size, dtype=np.uint8)

def add_noise(image, noise_level):
    noise = np.random.normal(0, noise_level, image.shape).astype(np.uint8)
    noisy_image = cv2.add(image, noise)
    return noisy_image

# Generate original image (180, 180)
original_image_size = (180, 180)
original = generate_dummy_image(original_image_size)

# Generate reconstructed image (71, 81) with added noise
reconstructed_image_size = (71, 81)
reconstructed = generate_dummy_image(reconstructed_image_size)
noise_level = 20  # You can adjust the noise level as needed
reconstructed = add_noise(reconstructed, noise_level)

resized_reconstructed_image = cv2.resize(reconstructed, (original.shape[1], original.shape[0]))

# Calculate PSNR
psnr = cv2.PSNR(original, resized_reconstructed_image)
print(f"PSNR: {psnr} dB")


# Display images (optional)
# cv2.imshow('Original Image', original)
# cv2.imshow('Reconstructed Image with Noise', reconstructed)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
© www.soinside.com 2019 - 2024. All rights reserved.