2017-04-07 8 views
0

치수가 400 x 500 인 2D 매트릭스가 있으며 각 매트릭스는 이미지를 표시합니다. 내 프로세스는 2 단계를 포함하고 : I는 I 한 매트릭스matlab을 사용하여 3d 매트릭스를 4d 매트릭스로 변환

제에게 이러한 분할을 각각 저장할 필요))와 동일한 크기의 부분 행렬 행 (

2 분할 행렬이 이미지를 분할 할

1) 단계가 완료되고 2D -> 3D에서 행렬의 차원이 변경됩니다. (마지막 색인은 분할의 색인을 표시합니다)

이제 2 단계에 대해 100 개의 이미지가 있고 마지막 색인이 표시되는 4 차원의 행렬이 필요합니다. 화상 수

s 충분한 : 이미지 (40)의 분할 3 액세스 : 이미 PERMUT를 사용하여 시도하고 바꿀 그러나 여기

성공하지 [:,:,3,40]

어떤 생각을 감상 할 수있다

nCol = 10; 
nRow = 4; 
K=dir(p); 
Len=length(K); 

for i=3:Len 
    x1=imread(strcat(p,'\',K(i).name)); 
    [m,n,d1]=size(x1); 
    if d1==1 
     x=double(x1); 
    else 
     x=double(rgb2gray(x1)); 
    end 
    x=imresize(x,NN); 

    %% determined width and height of divided matrix %%%%%%%%%%%%%%%%%%%%%%%%%% 

    m = size(x,1)/nRow; 
    n = size(x,2)/nCol; 

    T = permute(reshape(permute(reshape(x, size(x, 1), n, []), [2 1 3]), n, m, []), [2 1 3]); 

    Im=[Im T(:,:,:,i-2)]; 
end 

내 코드입니다.

+0

:이 옵션을 선택합니다 마지막 라인을'Im (:, :, :, i-2) = T'로 바꿈으로써'Im'에서? – Wolfie

+0

@ Wolfie 나는 그 대답을 시도했지만 !! – mkafiyan

+0

파이썬에서 왔을 때 들여 쓰기를 수정하려고했습니다 : –

답변

0

reshape은 열 주 순서로 요소를 선택하기 때문에 복잡한 코드를 작성해야 작동 할 수 있습니다. permutereshape을 사용하여 4D 행렬을 만들고 잠재적으로 메모리 부족 문제를 해결하는 대신에 mat2cell 행렬을 분할하려는 행렬을 나누기 위해 mat2cell을 사용하여 행렬을 셀 배열로 분할하는 것이 좋습니다. 영상.

여기에 나는 이미지 당신은 모든 이미지를 통해 루프 수와 배열의 각 층은 각각의 이미지 조각으로 분할 나타내는 3D 셀 어레이를 만들

RGB = imread('peppers.png'); 
x = rgb2gray(RGB); % x is a 384 x 512 matrix, we want to split in 3 rows and 2 columns 
x2 = mat2cell(x,384*ones(3,1)/3,512*ones(2,1)/2); % 2D cell array, each cell holds a part of the image 
imshow(x2{1,1}) % Top left part of the image 

으로 예를 보여줍니다. 배열을 미리 할당하고 행렬의 크기를 점진적으로 늘리는 것이 아니라 루프 내의 올바른 레이어에 행렬을 할당하는 것이 좋습니다.

또한 당신이하려고하는 일을하기 위해 이미지 처리 도구 상자 특정 기능을 할 수있을 것 같습니다 : 당신이 T``의 새로운 이미지의 3D 매트릭스가있는 경우이를 저장할 수 없습니다, How to divide an image into blocks in MATLAB?

관련 문제