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

Lena图像分解成小块与从小块合成 ➤01背景在2020年人工神经网络课程第一次作业第八题中需要对Lena图像使用AutoEncode网络进行压缩。将Lena(灰度图像)拆解成不同尺寸的大小形成训练压缩样本过程;或者从训练结果重新组合成Lena灰度图像是实验的基础。▲Lena灰度图像下面给出相关操作的Python程序和相关的结果。主要操作包括:将512×512的Lena灰度图片(0~255)分割成边长8~16的图像块,并通过行扫描形行向量;对图像进行归一化,形成数据在-0.5~0.5之

大家好,又见面了,我是你们的朋友全栈君。

在这里插入图片描述

 

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.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
#============================================================
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150977.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • psp坏点修复(psp贴吧)

    psp坏点&鉴别液晶坏点  暗点 亮点PC上挑选液晶LCD,借助第3方软件 例如NOKIA MONITOR TESTER 需要指出的是,亮点,暗点,坏点问题是液晶屏幕不可避免的先天性"生理缺陷",一般情况下,3个以下的"点"都是可以接受的.亮点:在黑屏幕情况下单纯地显示一种颜色的点,通常表现为在RED,GREEN,BLUE3种纯色模式下均显示白色.暗点:在R G B3种纯色模式下,均显示为黑色或不

  • XML Schema <第三篇>

    XML Schema <第三篇>

  • k8s中实现pod自动扩缩容「建议收藏」

    k8s中实现pod自动扩缩容「建议收藏」如何在k8s中实现基于cpu、内存的pod自动扩缩容来应对非线性资源使用情况,以满足业务需求、节约资源。

  • android layout 将EditText 和Button放在同一行

    android layout 将EditText 和Button放在同一行

  • vs2010 序列号「建议收藏」

    vs2010 序列号「建议收藏」序列号:YCFHQ-9DWCY-DKV88-T2TMH-G7BHP从网上搜的,经测试,可用信息来源:http://blog.163.com/ldy_3881685/blog/static/32380136201031333921823/示意图环境windows7旗舰中文+vs2010旗舰英文,vs2010自己从官网下载试用版本,然后输入序列号的步骤同vs200…

  • django修改数据_java实现增删改查

    django修改数据_java实现增删改查前言在ORM框架中,所有模型相关的操作,比如添加/删除等。其实都是映射到数据库中一条数据的操作。因此模型操作也就是数据库表中数据的操作。添加一个模型到数据库中:添加模型到数据库中。首先需要创建一

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号