欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

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

发布时间:2024/8/1 43 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Lena图像分解成小块与从小块合成 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

 

01 背景


2020年人工神经网络课程第一次作业第八题 中需要对 Lena 图像使用AutoEncode网络进行压缩。将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) / 256printf(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 = blockdataelse: outdata = vstack((outdata, blockdata))return outdata

2.测试上述模块

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

▲ 分割成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 + jnewimage = 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] = 0imagedata[imagedata > 255] = 255return 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 = 6def 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) / 256printf(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 = blockdataelse: 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] = 0imagedata[imagedata > 255] = 255return 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 + jnewimage = 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] = 0newdata = block2lena(outdata) printf(newdata.shape) newimage = Image.fromarray(newdata) newimage.show()#------------------------------------------------------------ # END OF FILE : SUBIMAGE.PY #============================================================

总结

以上是生活随笔为你收集整理的Lena图像分解成小块与从小块合成的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。