[英]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像素乘以邏輯矩陣的逆( ~
)。 這台所有的像素1
在CD
到0
,略過所有其他的像素作為其原始值(因為它們乘以1
)。
bsxfun(@times, ~CD, CDM)
然后,我們將CD
乘以新顏色(調整為1 x 1 x 3數組)以產生M x N x 3數組,其中CD
為1
每個RGB矢量是所需的RGB值,所有其他值均為0
。
bsxfun(@times, CD, reshape(replace_color, [1 1 3]))
然后,我們將這兩個加在一起以在CD
為0
位置保持RGB值,而在CD
為1
位置將RGB值替換為新值。
如果您使用的是R2016b或更高版本,則可以刪除bsxfun
,並將解決方案簡化為:
CDM = (~CD .* CDM) + (CD .* reshape(replace_color, [1 1 3]));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.