日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/8/1 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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图像分解成小块与从小块合成的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。