我想更改以下影像的給定塊,然后重建影像。

我想從這樣的影像中分割和更改 224x224x3 塊的像素。由于影像是 1024x1024x3,不會有整數個 224x224x3 的塊,numpyso,我要選擇影像的一個子區域來適應塊的形狀,如下:
>>> block_shape = np.array((224, 224, 3))
>>> nblocks = np.array(img.shape) // block_shape # integer division
>>> crop_r, crop_c, crop_ch = nblocks * block_shape
>>> cropped_img = img[:crop_r, :crop_c, :crop_ch]
因此,裁剪后的影像是影像的一個子區域,它將選擇 224x224x3 像素的非重疊塊
>>> cropped_img.shape
(896, 896, 3)
>>> Blocks = view_as_blocks(cropped_img, block_shape=(224, 224, 3))
>>> Blocks.shape
(4, 4, 1, 224, 224, 3)
現在,假設我想更改給定塊的像素,例如將第一個塊的所有像素歸零:
Blocks[0,0,:,:,:,:]=Blocks[0,0,:,:,:,:]*0
現在我已經改變了一個塊的塊。然后,我需要在更改該塊的情況下恢復cropped_img(通過將變數塊轉換回只有一個影像/NumPy 陣列),最后保存影像。如何在 Python 中做到這一點?
Ps=我檢查了一個類似的執行緒(
如果您確實需要解除阻塞,您希望將您的塊視為嵌套串列,并使用呼叫np.concatenate將引導軸上的塊沿其余軸連接起來。
在這種情況下,引導軸是塊的行,我們希望沿著其余軸的行進行連接,即軸 1:
intermediate = np.concatenate(blocked, axis=1)
print(intermediate.shape)
印刷:
(2, 512, 256)
所以我們現在有兩個“高”塊,我們想沿著列連接它們,在忽略引導軸之后,這又是軸 1。
unblocked = np.concatenate(intermediate, axis=1)
fig, ax = plt.subplots()
ax.imshow(unblocked)
plt.show()
這顯示了與上面相同的影像。
對于你的彩色影像,原理是一樣的,你只需要切換axis=1為axis=2.
uj5u.com熱心網友回復:
如果您愿意直接使用 Imagemagick(或者如果使用 Python 子行程則呼叫或使用基于 Imagemagick 的 Python Wand 執行相同操作),這非常簡單。即使是非全尺寸的瓷磚也被妥善保存。
輸入:

convert man.jpg -crop 50x50% man_tile_d.png
這會產生一個 2x2 的瓷磚陣列,標記為 man_tile_00.png man_tile_01.png man_tile_02.png 和 man_tile_03.png




然后將其重新構建:
convert man_tile_*.png -background none -flatten man_tile_reconstitute.jpg

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/431840.html
標籤:Python opencv 图像处理 计算机视觉 scikit 图像
上一篇:Conv1D、Conv2D、Conv3D之間的區別以及在卷積神經網路(CNN)中的使用位置
下一篇:TypeError:<tf.Tensor...具有型別<class'tensorflow.python.framework.ops.EagerTensor'>,但
