根据文件用python给出完整的代码,注释用中文,结果:输出mse(小于0.1),在一个窗口显示的图片“1.jpg原图,1.jpg由rgb转yuv,yuv转rgb;由rgb转YCbCr,YCbCr转rgb。
时间: 2024-11-09 10:31:43 浏览: 21
以下是实现颜色空间转换并计算MSE的完整Python代码。代码中包含了详细的中文注释,并且会在一个窗口中显示原图以及各种颜色空间转换后的图像。
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
def rgb_to_yuv(image):
"""
将RGB图像转换为YUV图像
:param image: 输入的RGB图像 (H, W, 3)
:return: 输出的YUV图像 (H, W, 3)
"""
# 定义RGB到YUV的转换矩阵
transform_matrix = np.array([[0.299, 0.587, 0.114],
[-0.147, -0.289, 0.436],
[0.615, -0.515, -0.100]])
# 进行矩阵乘法转换
yuv_image = np.dot(image, transform_matrix.T)
# 对U和V分量进行偏移
yuv_image[:, :, 1] += 128
yuv_image[:, :, 2] += 128
return yuv_image
def yuv_to_rgb(yuv_image):
"""
将YUV图像转换为RGB图像
:param yuv_image: 输入的YUV图像 (H, W, 3)
:return: 输出的RGB图像 (H, W, 3)
"""
# 定义YUV到RGB的转换矩阵
transform_matrix = np.array([[1.164, 0, 1.596],
[1.164, -0.392, -0.813],
[1.164, 2.017, 0]])
# 对YUV图像进行偏移
yuv_image = yuv_image.copy()
yuv_image[:, :, 0] -= 16
yuv_image[:, :, 1] -= 128
yuv_image[:, :, 2] -= 128
# 进行矩阵乘法转换
rgb_image = np.dot(yuv_image, transform_matrix.T)
# 确保像素值在0-255范围内
rgb_image = np.clip(rgb_image, 0, 255).astype(np.uint8)
return rgb_image
def rgb_to_ycbcr(image):
"""
将RGB图像转换为YCbCr图像
:param image: 输入的RGB图像 (H, W, 3)
:return: 输出的YCbCr图像 (H, W, 3)
"""
# 定义RGB到YCbCr的转换矩阵
transform_matrix = np.array([[0.299, 0.587, 0.114],
[-0.1687, -0.3313, 0.5],
[0.5, -0.4187, -0.0813]])
# 进行矩阵乘法转换
ycbcr_image = np.dot(image, transform_matrix.T)
# 对Cb和Cr分量进行偏移
ycbcr_image[:, :, 1] += 128
ycbcr_image[:, :, 2] += 128
return ycbcr_image
def ycbcr_to_rgb(ycbcr_image):
"""
将YCbCr图像转换为RGB图像
:param ycbcr_image: 输入的YCbCr图像 (H, W, 3)
:return: 输出的RGB图像 (H, W, 3)
"""
# 定义YCbCr到RGB的转换矩阵
transform_matrix = np.array([[1, 0, 1.402],
[1, -0.34414, -0.71414],
[1, 1.772, 0]])
# 对YCbCr图像进行偏移
ycbcr_image = ycbcr_image.copy()
ycbcr_image[:, :, 1] -= 128
ycbcr_image[:, :, 2] -= 128
# 进行矩阵乘法转换
rgb_image = np.dot(ycbcr_image, transform_matrix.T)
# 确保像素值在0-255范围内
rgb_image = np.clip(rgb_image, 0, 255).astype(np.uint8)
return rgb_image
def calculate_mse(image1, image2):
"""
计算两幅图像的均方误差 (MSE)
:param image1: 第一幅图像 (H, W, 3)
:param image2: 第二幅图像 (H, W, 3)
:return: 均方误差 (float)
"""
mse = np.mean((image1.astype("float") - image2.astype("float")) ** 2)
return mse
# 读取原始图像
original_image = cv2.imread('1.jpg')
original_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB)
# RGB to YUV and back to RGB
yuv_image = rgb_to_yuv(original_image)
rgb_from_yuv_image = yuv_to_rgb(yuv_image)
# RGB to YCbCr and back to RGB
ycbcr_image = rgb_to_ycbcr(original_image)
rgb_from_ycbcr_image = ycbcr_to_rgb(ycbcr_image)
# 计算MSE
mse_yuv = calculate_mse(original_image, rgb_from_yuv_image)
mse_ycbcr = calculate_mse(original_image, rgb_from_ycbcr_image)
print(f"MSE (YUV): {mse_yuv}")
print(f"MSE (YCbCr): {mse_ycbcr}")
# 显示图像
plt.figure(figsize=(12, 8))
plt.subplot(2, 3, 1)
plt.title("Original Image")
plt.imshow(original_image)
plt.axis('off')
plt.subplot(2, 3, 2)
plt.title("RGB to YUV")
plt.imshow(cv2.cvtColor(yuv_image.astype(np.uint8), cv2.COLOR_YUV2RGB))
plt.axis('off')
plt.subplot(2, 3, 3)
plt.title("YUV to RGB")
plt.imshow(rgb_from_yuv_image)
plt.axis('off')
plt.subplot(2, 3, 4)
plt.title("RGB to YCbCr")
plt.imshow(cv2.cvtColor(ycbcr_image.astype(np.uint8), cv2.COLOR_YCrCb2RGB))
plt.axis('off')
plt.subplot(2, 3, 5)
plt.title("YCbCr to RGB")
plt.imshow(rgb_from_ycbcr_image)
plt.axis('off')
plt.show()
```
### 说明
1. **颜色空间转换**:
- `rgb_to_yuv` 和 `yuv_to_rgb` 函数用于在RGB和YUV之间进行转换。
- `rgb_to_ycbcr` 和 `ycbcr_to_rgb` 函数用于在RGB和YCbCr之间进行转换。
2. **MSE计算**:
- `calculate_mse` 函数计算两幅图像的均方误差。
3. **图像显示**:
- 使用Matplotlib库在一个窗口中显示原图以及各种颜色空间转换后的图像。
运行此代码将显示原图、从RGB到YUV再转回RGB的图像、从RGB到YCbCr再转回RGB的图像,并打印MSE值。确保MSE值小于0.1以验证转换的准确性。
阅读全文