2016-11-25 2 views
1

MATLAB의 3D 배열에 1 차원 슬라이스를 어떻게 할당합니까?Matlab 3D 배열의 1D 슬라이스 할당

필자가 설정하고자하는 3 차원 이미지 행렬 (RGB 형식)의 픽셀에 해당하는 'CD'라는 논리적 인 2 차원 배열이 있습니다.

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

그래서이 경우, 'CDM'은 (예를 들어, 그것은 771x457x3 행렬의) 화소마다 R, G, B 값을 포함하는 3 차원 행렬이다.

위 코드가 작동합니다. 그것은 내가 원하는 빨강 픽셀의 이미지를 생성합니다.

하지만 녹색 또는 청록색 픽셀을 생성하고 싶다고 가정 해 보겠습니다. 'CDM'의 두 번째 및 세 번째 '레이어'(녹색 및 파란색 값)에 어떻게 액세스합니까? 나는

CDM(CD) = [0 255 255]; 

을 할당하려하지만, 당신은 (2 차원 배열)를 각 채널을 잡기 위해 필요하고 사용하는 같은 2 차원 배열로 각 채널을 수정하려면 오류

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

답변

2

을 반환 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])) 

설명

먼저 우리는 치수 방송을 수행하고, 논리 역행렬 (~)와 CDM 내의 각 RGB 화소를 곱 bsxfun을 사용한다. 그러면 1 인 모든 픽셀이 CD에서 0으로 설정되고 다른 모든 픽셀은 원래 값으로 유지됩니다 (1이 곱 해짐).

bsxfun(@times, ~CD, CDM) 

CD1 된 각 RGB 벡터 원하는 RGB 값이고 우리는 다음 M의 X에 N × 3 배열을 생성하기 위하여 (a 1 × 1 × 3 배열로 재 성형) 새로운 컬러로 CD를 곱하고 다른 모든 값은 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])); 
+0

세 가지 솔루션! 정말 좋은 답변입니다, 감사합니다. –

+0

R2016의 다른 점은 무엇입니까? "bsxfun'을 제거 할 수 있습니까? – Floris

+0

2016은 배열 연산 (?)을위한 싱글 톤 차원의 자동 확장을 수행합니다. 이것은 'bsxfun'의 기능입니다. – stephematician

관련 문제