Lena圖像分解成小塊與從小塊合成
?
01
背景
在 2020年人工神經網絡課程第一次作業第八題 中需要對 Lena 圖像使用AutoEncode網絡進行壓縮。將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.讀取數據分割
blocksize : 圖像塊的大?。? ~ 32
image_file :圖像文件
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2.測試上述模塊
下面測試上面的lena2block程序,并將分割成的小圖像塊重新進行顯示的結果。
tsprefreshimagebuffer(show_id) SHOW_LINES = 16 SHOW_COLS = 16 TEMP_FILE = r'd:\temp.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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
?
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2.測試
newdata = block2lena(outdata) printf(newdata.shape) newimage = Image.fromarray(newdata) newimage.show()
1
2
3
4
為了顯示對于block處理后的效果,下面對于每一塊都將前面一半填充0,然后再合成。
for b in outdata: b[0:len(b)//2] = 0
1
2
因此顯示的結果如下。
從上面結果來看,對于每一小塊的處理最終體現在合成后的圖片中。這也說明整個的圖片的分割與合成程序功能正常。這位之后對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.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 #============================================================
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。