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

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

(0)
上一篇 2022年6月19日 上午7:36
下一篇 2022年6月19日 上午7:36


相关推荐

  • jlink 与 swd 接口定义

    jlink 与 swd 接口定义1.JLink介绍J-Link是SEGGER公司为支持仿真ARM内核推出的JTAG仿真器。J-Link支持所有基于ARM架构的处理器或微控制器配合IAREWAR,ADS,KEIL等集成开发环境进行开发过程中进行单步控制执行调试。J-Link除了可以配合集成开发环境进行调试程序,进行程序下载之外,J-Link还可以单独使用。比如在产品的生产环节中,就可以单独使用J-Link进行固件的下载。JLink,SWD接口定义缺口向左,左边为JLink接口定义,右边为SWD接口定义JTAG

    2022年4月25日
    53
  • Mac安装Redis,原来就是这么简单

    Mac安装Redis,原来就是这么简单Mac 安装 Redis 使用 Homebrew 安装 Redis1 没有安装 Homebrew 首先安装 npm 国内的吧 快一些 打开终端输入以下命令 bin zsh c curl fsSLhttps gitee com cunkai HomebrewCN raw master Homebrew sh 2 使用 Homebrew 安装命令 brewinstallr 执行上述命令后出现以下 则成功安装 gt Downloadingh mirrors ustc

    2026年3月20日
    2
  • Manifest merger failed with multiple errors, see logs

    Manifest merger failed with multiple errors, see logs

    2021年9月30日
    50
  • oracle常用函数详解

    oracle常用函数详解oracle 数据库中主要使用两种类型的函数 1 单行函数 操作一行数据 返回一个结果常用的单行函数有 数字函数 对数字进行计算 返回一个数字 字符串函数 对字符串操作 日期函数 对日期和时间进行处理 转换函数 可以将一种数据类型转换为另外一种数据类型 2 聚合函数 多行函数 分组函数 组函数 操作多行数据 并返回一个结果 比如 SUM 一 数字函数数字函数接受数字参数 参数可以来自表中的一列 也可以是一个数字表达式 函数 说

    2026年3月18日
    2
  • MySql 字段类型对应 Java 实体类型

    MySql 字段类型对应 Java 实体类型MySql 字段类型对应 Java 实体类型前言 CopyMySQLCon J 对于 MySql 数据类型和 Java 数据类型之间的转换是很灵活的 一般来讲 任何 MySql 数据类型都可以被转换为一个 java lang String 任何 MySql 数字类型都可以被转换为任何一种 Java 数字类型 当然这样也可能出一些四舍五入 溢出 精度丢失之类的问题 Java 基础类型与包装类型 Copya 如果数据库字段是允许为空的 使用包

    2025年10月15日
    7
  • Linux之常用命令

    Linux之常用命令2.常用命令2.1命令格式的说明命令格式:命令\[-选项][参数]参数eg:ls-la/usr说明:大部分命令遵从该格式多个选项时,可以一起写eg:ls–l–als–la简化选项与完整选项(注:并非所有选项都可使用完整选项)eg:ls–allls–a帮助命令:(相当于命令说明书)2.2帮助命令2.2.1man英文:…

    2022年5月28日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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