1、编写一段程序,完成以下内容:
(1)读入图像 Lenna.png,显示该图像,并保存图像成 JPEG 格式文件 Lenna.jpg,比较 PNG 格式和 JPEG 格式文件,哪个文件占用的存储空间大?
(2)读入 Lenna.jpg,比较两个图像数据,它们是否相等?为什么?计算两个图像数据之 间的 PSNR 值。
from PIL import Image
import os
import numpy as np
from skimage.metrics import peak_signal_noise_ratio
# 读取图像
image = Image.open("./img/Lenna.png")
# 显示图像
image.show()
# 保存为JPEG格式
image.save("./img/Lenna.jpg", "JPEG")
# 比较文件大小
png_size = os.path.getsize("./img/Lenna.png")
jpg_size = os.path.getsize("./img/Lenna.jpg")
print("PNG格式文件大小:", png_size, "bytes")
print("JPEG格式文件大小:", jpg_size, "bytes")
if png_size > jpg_size:
print("PNG格式文件占用存储空间更大")
elif png_size < jpg_size:
print("JPEG格式文件占用存储空间更大")
else:
print("PNG和JPEG格式文件大小相同")
# 读取原始图像和 JPEG 格式图像
original_image = Image.open("./img/Lenna.png")
jpeg_image = Image.open("./img/Lenna.jpg")
# 将图像转换为 NumPy 数组
original_array = np.array(original_image)
jpeg_array = np.array(jpeg_image)
# 检查图像数据是否相等
if np.array_equal(original_array, jpeg_array):
print("两个图像的数据完全相等")
else:
print("两个图像的数据不相等")
# 计算 PSNR 值
psnr = peak_signal_noise_ratio(original_array, jpeg_array)
print("PSNR 值为:{:.2f}". format(psnr))
PS:原图像放在同文件夹下创建的img文件夹
2. 编写一段程序,完成以下内容:
(1)读入图像 Lenna.png 为 im,显示该图像红色、绿色、蓝色通道(显示为灰度图像);
(2)提取(100,20)位置的颜色值;
(3)将图像转换为灰度图像 gray,计算灰度平均值(可使用 cv2.cvtColor,注意 OpenCV 读入彩色图像后通道顺序默认为 BGR。也可以使用 pillow 包的转换函数,或其他包的 转换函数,但是要求 gray 是 uint8);
(4)打印 gray 以(100,20)为中心的 5x5 邻域;
(5)将 gray 转换为[0,1]之间的浮点数图像 grayfloat,在此基础上叠加均值为 0,方差 为 0.01 的高斯噪声,显示受噪声污染的图像 gray_noisy;
(6)图像处理中,经常会用到 padding 填充,将 gray 上下左右各填充 10 个像素,填充 灰度值为 0,显示填充后图像 gray_padding;
(7)图像处理中,经常会用到下采样,将 gray 进行1 2 × 1 2 下采样,即行方向每两个像素采 样 1 个,列方向每两个像素采样 1 个,显示下采样后的图像 gray_ds。
import cv2
import numpy as np
# (1) 读入图像 Lenna.png 为 im,显示该图像红色、绿色、蓝色通道(显示为灰度图像)
im = cv2.imread('Lenna.png')
b, g, r = cv2.split(im)
# 显示红色、绿色、蓝色通道
cv2.imshow('Red Channel', r)
cv2.imshow('Green Channel', g)
cv2.imshow('Blue Channel', b)
cv2.waitKey(0)
cv2.destroyAllWindows()
# (2) 提取(100,20)位置的颜色值
color_at_point = im[20, 100]
print("(100,20)位置的颜色值:", color_at_point)
# (3) 将图像转换为灰度图像 gray,计算灰度平均值
gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
average_gray = np.mean(gray)
print("灰度平均值:{:.4f}".format(average_gray))
# (4) 打印 gray 以(100,20)为中心的 5x5 邻域
print("以(100,20)为中心的 5x5 邻域:")
print(gray[18:23, 95:100])
# (5) 将 gray 转换为[0,1]之间的浮点数图像 grayfloat,并添加高斯噪声
grayfloat = gray.astype(np.float32) / 255.0
noise = np.random.normal(0, 0.01, gray.shape)
gray_noisy = np.clip(grayfloat + noise, 0, 1)
# 显示受噪声污染的图像
cv2.imshow('Noisy Gray Image', gray_noisy)
cv2.waitKey(0)
cv2.destroyAllWindows()
# (6) 填充灰度图像
gray_padding = cv2.copyMakeBorder(gray, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=0)
# 显示填充后图像
cv2.imshow('Padded Gray Image', gray_padding)
cv2.waitKey(0)
cv2.destroyAllWindows()
# (7) 下采样灰度图像
gray_ds = cv2.resize(gray, (0, 0), fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
# 显示下采样后的图像
cv2.imshow('Downsampled Gray Image', gray_ds)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像放在py同文件夹即可