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


相关推荐

  • expect教程

    expect教程新建文件 data software expect expect 5 43 bin expect fseta lindex argv0 spawnvi asend i send Thisisatest send 033 nbsp nbsp nbsp 输入 escsend wq n 注意回车 send 后面的内容分两行也可以输出回车 缺点是结果带换行符

    2026年3月16日
    2
  • Coze高阶工作流实战:变量+循环+批处理+聚合模块,手把手搭建文案创作、PPT 生成等 10+ 智能体

    Coze高阶工作流实战:变量+循环+批处理+聚合模块,手把手搭建文案创作、PPT 生成等 10+ 智能体

    2026年3月13日
    3
  • linux下DNS配置及域名解析服务

    linux下DNS配置及域名解析服务一.DNS(DomainNameSystem,域名系统)    因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。    DNS服务器将域名解析出来,找到域名对应的ip地址的…

    2022年5月24日
    46
  • 硬编码和软编码

    硬编码和软编码计算机科学中 只有硬编码 hardcode 以及非硬编码 有人也成为 软编码 硬编码和软编码的区别是 软编码可以在运行时确定 修改 而硬编码是不能够改变的 java 小例子 inta 2 b 2 硬编码 if a 2 returnfalse 非硬编码 if a b returntrue 就是把数值写成常量而不是变量 一个简单的版本

    2026年3月26日
    2
  • 为什么必须做密评

    为什么必须做密评密评全称 商用密码应用安全性评估定义 对采用商用密码技术 产品和服务集成建设的网络和信息系统密码应用的合规性 正确性 有效性进行评估 1 密评发展史 2011 年 ZUC 序列算法成为了 4G 移动通信密码算法国际标准 2017 年 非对称算法 SM2 和 SM9 的数字签名算法成为国际标准 2018 年 密码杂凑算法 SM3 成为国际标准 2021 年 2 月 SM9 标识加密算法成为国际标准 6 月 SM4 分组密码算法成为国际标准 10 月 SM9 密钥交换协议成为国际标准我国自主研发的密码算法相继走出国门并受到国际上的认可 国密局

    2025年6月21日
    5
  • docker部署web项目_docker web管理工具

    docker部署web项目_docker web管理工具前言前面我们运行的容器并没有一些什么特别的用处。接下来让我们尝试使用docker构建一个web应用程序。我们将在docker容器中运行一个PythonFlask应用来运行一个web

    2022年7月29日
    9

发表回复

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

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