Lena图像分解成小块与从小块合成
生活随笔
收集整理的這篇文章主要介紹了
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
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图像分解成小块与从小块合成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【第六届蓝桥杯】奇妙的数字
- 下一篇: 资深java面试题及答案整理(一)