簡體   English   中英

Matlab分配3D陣列的1D切片

[英]Matlab Assigning 1D slice of 3D array

如何在MATLAB中的3d數組中分配一維切片?

我有一個名為“ CD”的邏輯二維數組,它對應於我要設置的3-D圖像矩陣(RGB格式)的像素。

CD = any(d, 3);
CDM(CD) = 255;

因此,在這種情況下,“ CDM”是一個3d矩陣,其中包含每個像素的R,G,B值(例如,它是771x457x3矩陣)。

上面的代碼有效。 它會生成我想要的紅色像素的圖像。

但是現在假設我要生成綠色或青色像素? 如何訪問“ CDM”的第二和第三“層”(綠色和藍色值)? 我嘗試分配

CDM(CD) = [0 255 255];

但這會返回錯誤

In an assignment  A(:) = B, the number of elements in A and B must be the same.

為了用這樣的2D數組修改每個通道,您需要獲取每個通道(作為2D數組),然后使用2D邏輯數組用所需的值替換所需的像素,然后將其分配回該數組。

green = CDM(:,:,2);
green(CD) = 255;
CDM(:,:,2) = green;

或者,您可以執行以下操作來向量化問題。

replace_color = [0 255 255];
CDM = bsxfun(@times, ~CD, CDM) + bsxfun(@times, CD, reshape(replace_color, [1 1 3]))

說明

首先,我們使用bsxfun進行尺寸廣播,並將CDM每個RGB像素乘以邏輯矩陣的逆( ~ )。 這台所有的像素1CD0 ,略過所有其他的像素作為其原始值(因為它們乘以1 )。

bsxfun(@times, ~CD, CDM)

然后,我們將CD乘以新顏色(調整為1 x 1 x 3數組)以產生M x N x 3數組,其中CD1每個RGB矢量是所需的RGB值,所有其他值均為0

bsxfun(@times, CD, reshape(replace_color, [1 1 3]))

然后,我們將這兩個加在一起以在CD0位置保持RGB值,而在CD1位置將RGB值替換為新值。

如果您使用的是R2016b或更高版本,則可以刪除bsxfun ,並將解決方案簡化為:

CDM = (~CD .* CDM) + (CD .* reshape(replace_color, [1 1 3]));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM