大家好,又见面了,我是你们的朋友全栈君。
➤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) / 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灰度图片
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
#============================================================
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150977.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...