from PIL import Image import numpy as np import io # 读取原始图像和压缩后图像 original_img = Image.open('test.jpg') compressed_img = Image.open('test_compressed.jpg') # 将图像转换为 NumPy 数组 original_img_arr = np.array(original_img) compressed_img_arr = np.array(compressed_img) # 计算原始图像大小 original_size = original_img_arr.nbytes # 计算压缩后图像大小 compressed_size = compressed_img_arr.nbytes # 计算压缩率 compression_ratio = compressed_size / original_size # 计算峰值信噪比(PSNR) mse = np.mean((original_img_arr - compressed_img_arr) ** 2) psnr = 10 * np.log10(255**2 / mse) # 计算结构相似性指数(SSIM) from skimage.metrics import structural_similarity as ssim ssim_score = ssim(original_img_arr, compressed_img_arr, multichannel=True) # 计算峰值信噪比改进比(PSNR-HVS) from skimage.metrics import peak_signal_noise_ratio as psnr_hvs psnr_hvs_score = psnr_hvs(original_img_arr, compressed_img_arr, data_range=original_img_arr.max()) # 计算多样性信噪比(MS-SSIM) from skimage.metrics import multi_scale_ssim as ms_ssim ms_ssim_score = ms_ssim(original_img_arr, compressed_img_arr, data_range=original_img_arr.max(), win_size=11) # 计算复杂度压缩比(CPC) cpc = psnr / compression_ratio # 输出七种压缩率 print(f"Compression ratio: {compression_ratio:.4f}") print(f"Peak Signal-to-Noise Ratio (PSNR): {psnr:.2f}") print(f"Structural Similarity Index (SSIM): {ssim_score:.4f}") print(f"Peak Signal-to-Noise Ratio - HVS (PSNR-HVS): {psnr_hvs_score:.2f}") print(f"Multi-Scale Structural Similarity (MS-SSIM): {ms_ssim_score:.4f}") print(f"Complexity-Compression Ratio (CPC): {cpc:.2f}") print(f"Original size: {original_size:,}") print(f"Compressed size: {compressed_size:,}")ValueError: operands could not be broadcast together with shapes (417,556,3) (418,558,3)
时间: 2024-02-17 08:00:43 浏览: 158
这个错误通常是由于两个数组的形状不匹配导致的。在您的情况下,您正在尝试将形状为(417,556,3)和(418,558,3)的两个数组进行广播操作,但它们的形状不兼容。
根据您提供的代码,错误可能出现在以下几行中:
```python
original_img_arr = np.array(original_img)
compressed_img_arr = np.array(compressed_img)
```
这两行代码将 PIL.Image 对象转换为 NumPy 数组。如果两个图像的大小不同,则它们的数组形状也不同,这可能导致广播错误。
您可以尝试查看这两张图像的大小,看看它们是否匹配。或者,您可以尝试调整图像的大小,使它们具有相同的形状,然后再将它们转换为 NumPy 数组。
例如,您可以使用 PIL 库中的 resize() 函数来调整图像的大小:
```python
original_img = original_img.resize((width, height))
compressed_img = compressed_img.resize((width, height))
```
其中,width 和 height 是您想要的新图像的宽度和高度。然后,您可以将这两张图像转换为 NumPy 数组,并继续计算 PSNR、SSIM 等指标。
相关问题
写一个在jupyter notebooks上测量彩色图像压缩前后压缩率的代码
好的,以下是一个在 Jupyter Notebook 上测量彩色图像压缩前后压缩率的代码示例。这个代码使用了 Python 的 Pillow 库进行图像的读取和压缩,以及 NumPy 库进行数组计算。
```python
from PIL import Image
import numpy as np
import io
# 读取原始图像
img = Image.open('test.jpg')
# 将图像转换为 NumPy 数组
img_arr = np.array(img)
# 计算原始图像大小
original_size = img_arr.nbytes
# 压缩图像
# 这里使用 JPEG 压缩,压缩质量为 70%
compressed_img = io.BytesIO()
img.save(compressed_img, format='JPEG', quality=70)
# 计算压缩后图像大小
compressed_size = compressed_img.tell()
# 读取压缩后图像
compressed_img.seek(0)
compressed_img_data = compressed_img.read()
compressed_img = Image.open(io.BytesIO(compressed_img_data))
# 将压缩后图像转换为 NumPy 数组
compressed_img_arr = np.array(compressed_img)
# 计算压缩率
compression_ratio = compressed_size / original_size
# 输出压缩前后的大小和压缩率
print(f"Original size: {original_size:,}")
print(f"Compressed size: {compressed_size:,}")
print(f"Compression ratio: {compression_ratio:.2f}")
```
在这个示例中,我们首先使用 Pillow 库读取了一张名为 `test.jpg` 的彩色图像,并将其转换为 NumPy 数组。然后,我们计算了原始图像的大小,并使用 JPEG 压缩算法对图像进行了压缩。接着,我们计算了压缩后图像的大小,并将其读取为 Pillow 对象。我们将压缩后的图像再次转换为 NumPy 数组,并计算了压缩率。最后,我们输出了压缩前后的大小和压缩率的结果。
请注意,这个示例中压缩质量设置为 70%,这个值可以根据需要进行调整。另外,如果要测量多张图像的压缩前后压缩率,可以将这个代码放入循环中,对每张图像进行压缩和压缩率计算。
已经有了压缩前后的彩色图像,写一个在jupyter notebooks上计算七压缩率的代码
好的,以下是一个在 Jupyter Notebook 上计算七种压缩率的代码示例。这个代码使用了 Python 的 Pillow 库进行图像的读取和压缩,以及 NumPy 库进行数组计算。
```python
from PIL import Image
import numpy as np
import io
# 读取原始图像和压缩后图像
original_img = Image.open('test.jpg')
compressed_img = Image.open('test_compressed.jpg')
# 将图像转换为 NumPy 数组
original_img_arr = np.array(original_img)
compressed_img_arr = np.array(compressed_img)
# 计算原始图像大小
original_size = original_img_arr.nbytes
# 计算压缩后图像大小
compressed_size = compressed_img_arr.nbytes
# 计算压缩率
compression_ratio = compressed_size / original_size
# 计算峰值信噪比(PSNR)
mse = np.mean((original_img_arr - compressed_img_arr) ** 2)
psnr = 10 * np.log10(255**2 / mse)
# 计算结构相似性指数(SSIM)
from skimage.metrics import structural_similarity as ssim
ssim_score = ssim(original_img_arr, compressed_img_arr, multichannel=True)
# 计算峰值信噪比改进比(PSNR-HVS)
from skimage.metrics import peak_signal_noise_ratio as psnr_hvs
psnr_hvs_score = psnr_hvs(original_img_arr, compressed_img_arr, data_range=original_img_arr.max())
# 计算多样性信噪比(MS-SSIM)
from skimage.metrics import multi_scale_ssim as ms_ssim
ms_ssim_score = ms_ssim(original_img_arr, compressed_img_arr, data_range=original_img_arr.max(), win_size=11)
# 计算复杂度压缩比(CPC)
cpc = psnr / compression_ratio
# 输出七种压缩率
print(f"Compression ratio: {compression_ratio:.4f}")
print(f"Peak Signal-to-Noise Ratio (PSNR): {psnr:.2f}")
print(f"Structural Similarity Index (SSIM): {ssim_score:.4f}")
print(f"Peak Signal-to-Noise Ratio - HVS (PSNR-HVS): {psnr_hvs_score:.2f}")
print(f"Multi-Scale Structural Similarity (MS-SSIM): {ms_ssim_score:.4f}")
print(f"Complexity-Compression Ratio (CPC): {cpc:.2f}")
print(f"Original size: {original_size:,}")
print(f"Compressed size: {compressed_size:,}")
```
在这个示例中,我们首先使用 Pillow 库读取了一张名为 `test.jpg` 的原始彩色图像和一张名为 `test_compressed.jpg` 的压缩后彩色图像,并将它们分别转换为 NumPy 数组。然后,我们使用 NumPy 和 scikit-image 库计算了七种压缩率,包括压缩率、峰值信噪比(PSNR)、结构相似性指数(SSIM)、峰值信噪比改进比(PSNR-HVS)、多尺度结构相似性指数(MS-SSIM)、复杂度压缩比(CPC)以及原始图像大小和压缩后图像大小。最后,我们输出了这七种压缩率的结果。
请注意,这个示例中使用了 scikit-image 库的一些函数,如果您的环境中没有安装该库,请先使用 pip 或 conda 进行安装。另外,这个示例中计算的七种压缩率可能并不完整,具体的压缩率指标可以根据需要进行调整。
阅读全文