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

举报
tsinghuazhuoqing 发表于 2021/12/26 01:08:31 2021/12/26
【摘要】   ➤01 背景 在 2020年人工神经网络课程第一次作业第八题 中需要对 Lena 图像使用AutoEncode网络进行压缩。将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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

 

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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

2.测试

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

  
 
  • 1
  • 2
  • 3
  • 4

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

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

  
 
  • 1
  • 2

因此显示的结果如下。

▲ 简单填充后的合成图像

▲ 简单填充后的合成图像

从上面结果来看,对于每一小块的处理最终体现在合成后的图片中。这也说明整个的图片的分割与合成程序功能正常。这位之后对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
#============================================================

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91

文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。

原文链接:zhuoqing.blog.csdn.net/article/details/109995549

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。