我使用下面的代碼將影像分成塊
block = []
for x in range(0, 224,16):
for y in range(0, 224,16):
block.append(im[y:y 16, x:x 16])
np_block = np.array(block)

影像形狀為224,224,3,每個塊為16,16,3。如何將這些塊組合在一起以形成完整的影像?當我重塑它(np_block.reshape(224, 224,3))時,我得到了與真實影像完全不同的下圖

編輯: 這已在評論部分得到回答,如下所示:
reshaped_img = np_block.reshape(14,14,16,16,3).transpose(0,3,1,2,4).reshape(14*16,14*16,3)
與原始影像相比,生成的影像被旋轉并翻轉。這是原始影像

這是所提供的將塊合并在一起的方法的結果影像

這樣做restored_img = np.flip(np.rot90(reshaped_img, k=1, axes=(0, 1)), axis=0)將正確地將生成的影像恢復為其原始形式。
但是,restored_img在 pytorch 中轉換為張量,tensor_img = torch.from_numpy(restored_img)會引發以下錯誤:
ValueError: At least one stride in the given numpy array is negative, and tensors with negative strides are not currently supported. (You can probably work around this by making a copy of your array with array.copy().)
我按照錯誤訊息中的建議解決了這個問題。
tensor_img = torch.from_numpy(restored_img.copy())擺脫了錯誤,但restored_img不保留所做的轉換(旋轉和翻轉)。tensor_img仍然與上面的最后一張圖片相同。
我注意到在分割原始影像時,分割的塊沒有以正確的順序附加。這在np_block我將其可視化時很明顯(上面的第一張圖片看起來是翻轉和旋轉的)。所以,我把這條線block.append(im[y:y 16, x:x 16])改成block.append(im[x:x 16, y:y 16])
因此,重新可視化np_block會給出以下影像

這似乎更接近原始影像,并且塊也看起來它們的順序正確(這是我觀察到的)。但是這些塊不相互重疊。
請問我該如何解決這個問題?
uj5u.com熱心網友回復:
您好,提出的原始解決方案的問題是您必須重新排列塊0,3,1,2如果您交換這些尺寸,那么它將得到解決。查看:
block = [] #create blocks
for x in range(0, 224,16):
for y in range(0, 224,16):
block.append(im[y:y 16, x:x 16])
np_block = np.array(block)
reshaped_img = np_block.reshape(14,14,16,16,3).transpose(1,2,0,3,4).reshape(14*16,14*16,3)
#check indices are now (1,2,0,3,4) instead of (0,3,1,2,4)
plt.imshow(np.hstack([im,reshaped_img]))
編輯
同樣來自原始評論,這只是轉置輸出尺寸
reshaped_img.transpose(1,0),但是如果您可以在原始重塑中進行更正,這是一個更好的解決方案
編輯 2
使用更正的堆疊(在第一維中使用 x),代碼將是:
block = []
for x in range(0, 224,16):
for y in range(0, 224,16):
block.append(im[x:x 16, y:y 16])
np_block = np.array(block)
reshaped_img = np_block.reshape(14,14,16,16,3).transpose(0,2,1,3,4).reshape(14*16,14*16,3)
這里有莫爾斯意義:塊中 reshape 的第一個維度 (dim 0) 與子塊的第一個維度 (dim 2) 被分組,然后對于塊和子塊 (1,3) 的第二個維度相同。
在任何情況下,您都可以通過以下方式檢查好的解決方案:
plt.imshow(np.hstack([im,reshaped_img]))
編輯 3 上次編輯,這里是檢查原始塊重塑的代碼(使用編輯 2 的代碼)。在這里,您可以看到每個塊都有一些在影像中被切割的感覺:
b = np_block.reshape(14,14,16,16,3)
plt.figure()
for i in range(14):
for j in range(14):
plt.subplot(14,14,14*i j 1)
plt.imshow(b[i,j])
plt.axis('off')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/497003.html
