Lena图像分解成小块与从小块合成

在这里插入图片描述

 

01 背景


2020年人工神经网络课程第一次作业第八题 中需要对 Lena 图像使用AutoEncode网络进行压缩。将Lena(灰度图像)拆解成不同尺寸的大小形成训练压缩样本过程;或者从训练结果重新组合成Lena灰度图像是实验的基础。

▲ Lena灰度图像

▲ Lena灰度图像

下面给出相关操作的Python程序和相关的结果。

主要操作包括:

  • 将512×512的Lena灰度图片(0 ~ 255)分割成边长8 ~ 16的图像块,并通过行扫描形行向量;
  • 对图像进行归一化,形成数据在 -0.5 ~ 0.5之间的数据;
  • 将训练结果恢复到0 ~ 255并组合成灰度图片,存盘,或者显示。

 

02 图像分割


Lena下载Lean灰度(512×512)的图片数据,存储在本地目录下:lean_gray.bmp。文件格式为BMP。

1.读取数据分割

(1) 输入参数
  • blocksize : 图像块的大小:8 ~ 32
  • image_file :图像文件
(2) 输出参数
  • outdata: 2D-array。每一行是图像block所形成的一位数据;总行数为block数量;
    数据格式:float: -0.5 ~ 0.5
def lena2block(blocksize,image_file):
    img = Image.open(image_file).convert('RGB')

    imgdata = array(img)[:,:,0].astype(float32)
    imgheight = imgdata.shape[0]
    imgwidth = imgdata.shape[1]
    imgdata = (imgdata - 128) / 256

    printf(imgdata.shape)

    outdata = []
    for i in range(0, imgheight, blocksize):
        for j in range(0, imgwidth, blocksize):
            blockdata = imgdata[i:i+blocksize, j:j+blocksize].reshape(1, -1)

            if len(outdata) == 0: outdata = blockdata
            else: outdata = vstack((outdata, blockdata))

    return outdata

2.测试上述模块

下面测试上面的lena2block程序,并将分割成的小图像块重新进行显示的结果。

▲ 分割成32×32小块的Lena灰度图片

▲ 分割成32×32小块的Lena灰度图片

tsprefreshimagebuffer(show_id)

SHOW_LINES      = 16
SHOW_COLS       = 16
TEMP_FILE       = r'd:\temp\1.bmp'

for i in range(SHOW_LINES):
    for j in range(SHOW_COLS):
        blockid = i * 16 + j
        newimage = Image.fromarray((outdata[blockid].reshape(IMAGE_BLOCK_SIZE, IMAGE_BLOCK_SIZE) * 256 + 128).astype(uint8))
        newimage.save(TEMP_FILE)
        x = j * (IMAGE_BLOCK_SIZE + 2)
        y = i * (IMAGE_BLOCK_SIZE + 2)

        tspshowimage(show_id, x, y, x + IMAGE_BLOCK_SIZE, y + IMAGE_BLOCK_SIZE, TEMP_FILE)

tsprv()

 

03 图像合成


将前面分割的图像重新整合成lena图片图片。

1.图片合成代码

def block2lena(blockdata):
    blocknum = blockdata.shape[0]
    blocklen = blockdata.shape[1]
    block_size = int(sqrt(blocklen))
    image_block_size = int(sqrt(blocknum))

    block_line = []
    for i in range(image_block_size):
        block_row = hstack([b.reshape(block_size, block_size) \
                            for b in blockdata[i*image_block_size:(i+1)*image_block_size]])
        block_line.append(block_row)

    imagedata = vstack(block_line)
    imagedata = (imagedata * 256 + 128)
    imagedata[imagedata < 0] = 0
    imagedata[imagedata > 255] = 255
    return imagedata.astype(uint8)

2.测试

newdata = block2lena(outdata)
printf(newdata.shape)
newimage = Image.fromarray(newdata)
newimage.show()

为了显示对于block处理后的效果,下面对于每一块都将前面一半填充0,然后再合成。

for b in outdata:
    b[0:len(b)//2] = 0

因此显示的结果如下。

▲ 简单填充后的合成图像

▲ 简单填充后的合成图像

从上面结果来看,对于每一小块的处理最终体现在合成后的图片中。这也说明整个的图片的分割与合成程序功能正常。这位之后对2020年人工神经网络课程第一次作业第八题的效果进行评估提供了可视化的子函数。

 

※ 结论


对于Lena灰度图像,通过两个子函数可以完成对其切分成小块,然后再合成,这由于2020年人工神经网络课程第一次作业第八题中的结果进行显示。便于评估图像处理结果。

 

□ 实验Python程序

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# SUBIMAGE.PY                  -- by Dr. ZhuoQing 2020-11-23
#
# Note:
#============================================================

from headm import *
from PIL                    import Image

#------------------------------------------------------------
lena_gray = r'D:\Temp\lena_gray.bmp'
show_id = 6

def lena2block(blocksize,image_file):
    img = Image.open(image_file).convert('RGB')

    imgdata = array(img)[:,:,0].astype(float32)
    imgheight = imgdata.shape[0]
    imgwidth = imgdata.shape[1]
    imgdata = (imgdata - 128) / 256

    printf(imgdata.shape)

    outdata = []
    for i in range(0, imgheight, blocksize):
        for j in range(0, imgwidth, blocksize):
            blockdata = imgdata[i:i+blocksize, j:j+blocksize].reshape(1, -1)

            if len(outdata) == 0: outdata = blockdata
            else: outdata = vstack((outdata, blockdata))

    return outdata

#------------------------------------------------------------
def block2lena(blockdata):
    blocknum = blockdata.shape[0]
    blocklen = blockdata.shape[1]
    block_size = int(sqrt(blocklen))
    image_block_size = int(sqrt(blocknum))

    block_line = []
    for i in range(image_block_size):
        block_row = hstack([b.reshape(block_size, block_size) \
                            for b in blockdata[i*image_block_size:(i+1)*image_block_size]])
        block_line.append(block_row)

    imagedata = vstack(block_line)
    imagedata = (imagedata * 256 + 128)
    imagedata[imagedata < 0] = 0
    imagedata[imagedata > 255] = 255
    return imagedata.astype(uint8)

#------------------------------------------------------------
IMAGE_BLOCK_SIZE        = 32
outdata = lena2block(IMAGE_BLOCK_SIZE, lena_gray)
printf(outdata.shape)

#------------------------------------------------------------
tsprefreshimagebuffer(show_id)

SHOW_LINES      = 16
SHOW_COLS       = 16
TEMP_FILE       = r'd:\temp\1.bmp'

for i in range(SHOW_LINES):
    for j in range(SHOW_COLS):
        blockid = i * 16 + j
        newimage = Image.fromarray((outdata[blockid].reshape(IMAGE_BLOCK_SIZE, IMAGE_BLOCK_SIZE) * 256 + 128).astype(uint8))
        newimage.save(TEMP_FILE)
        x = j * (IMAGE_BLOCK_SIZE + 2)
        y = i * (IMAGE_BLOCK_SIZE + 2)

        tspshowimage(show_id, x, y, x + IMAGE_BLOCK_SIZE, y + IMAGE_BLOCK_SIZE, TEMP_FILE)

tsprv()

#------------------------------------------------------------

for b in outdata:
    b[0:len(b)//2] = 0

newdata = block2lena(outdata)
printf(newdata.shape)
newimage = Image.fromarray(newdata)
newimage.show()

#------------------------------------------------------------
#        END OF FILE : SUBIMAGE.PY
#============================================================
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值