图像分解和重建

目录

    • 图像的分解
    • 图像重建

为深入了解数字图像,我们载入图像,将图像分解成RGB三个通道,分别显示;然后将三个通道的图像合并成原始图像。如下为Python的实现。

图像的分解

from skimage import data
from matplotlib import pyplot as plt
import numpy as np

image=data.coffee()  #载入测试图像
ratio=20               #设置量化比率
print(image.shape)

image_test=np.zeros((int(image.shape[0]/ratio),
                 int(image.shape[1]/ratio),image.shape[2]),dtype='int32')#设置采样后图像大小

for i in range(image_test.shape[0]):
    for j in range(image_test.shape[1]):
        for k in range(image_test.shape[2]):
            #image_test[i][j][k]=int(image[i][j][k]/ratio)*ratio
            delta = image[i * ratio:(i + 1) * ratio, j * ratio:(j + 1) * ratio, k]  # 获取需要采样图像块
            image_test[i, j, k] = np.mean(delta)  # 计算均值,并存入结果图
            #对图像每个像素进行量化

#分别取出红、绿、蓝三个颜色通道
image_test_r=image_test[:,:,0]
image_test_g=image_test[:,:,1]
image_test_b=image_test[:,:,2]
print(image_test)  # 采样的图像里面只有0,128

图像重建

def set_chinese():  # 中文显示工具函数
    import matplotlib
    print("[INFO] matplotlib版本为:%s" % matplotlib.__version__)
    matplotlib.rcParams['font.sans-serif'] = ['SimHei']
    matplotlib.rcParams['axes.unicode_minus'] = False

#图像重建
re_image = np.zeros(image.shape,dtype='int32')#如果不加dtype='int32',默认为浮点,显示结果完全不一样
#分别取出红、绿、蓝三个颜色通道
image_r=image[:,:,0]
image_g=image[:,:,1]
image_b=image[:,:,2]

for i in range(re_image.shape[0]):
    for j in range(re_image.shape[1]):
        re_image[i,j]=np.array([image_r[i,j],image_g[i,j],image_b[i,j]]) #红、绿、蓝三个颜色叠加
        #re_image[i, j] = [[ [image_r[i, j], image_g[i, j], image_b[i, j]] ]]  # 错误不能直接用[],要用np.array

#print(re_image)

plt.figure()
plt.subplot(321),plt.imshow(image),plt.title("原图"),plt.axis("off")
plt.subplot(322),plt.imshow(re_image),plt.title("复原图像"),plt.axis("off")#打印RGB复原图像
plt.subplot(323),plt.imshow(image_r),plt.title("红色通道"),plt.axis("off")#打印红色通道
plt.subplot(324),plt.imshow(image_g),plt.title("蓝色通道"),plt.axis("off")#打印蓝色通道

plt.subplot(325),plt.imshow(image_test),plt.title("取样图像"),plt.axis("off")#打印均值取样图像
plt.subplot(326),plt.imshow(image_test_g),plt.title("取样蓝色通道"),plt.axis("off")#打印蓝色通道

plt.show()

你可能感兴趣的:(数字图像处理,python,机器学习,深度学习)