图像基本操作与图像变换

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同文件夹即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值