2016-08-02 290 views
0

我想在Matlab中重疊一組圖像。圖像在不同的時間是相同的對象。在我的代碼:在Matlab中重疊圖像

for k=1:20 

% code executed with output 'image' 

image_rotate = imrotate(image,-90); %put dataset in correct orientation 

data.(['val' num2str(k)]) = image_rotate; % save the dataset. Access first iteration data.val1, ... data.val20 (all with same size 223x375 dataset, which in binary with the object '1' and background '0') 

end 

% what I have been using to plot the dataset 

figure, imshow(data.val51),axis image, impixelinfo, colormap(jet) 

我想用「data.val51」,「data.val52」重疊的數字(也許在一個單獨的循環),......展現物體隨着時間的推移越來越大,與每個圖像分配了不同的顏色,背景被刪除(白色)。任何幫助實施這將不勝感激。

有關如何使用每個時間步的前面的圖像找到距離的進一步指導將非常感激。謝謝。

+0

會顯示一個簡短的視頻有助於你想達到什麼樣的?在這種情況下:http://in.mathworks.com/help/matlab/examples/convert-between-image-sequences-and-video.html可能是一個很好的資源 – optimist

+0

謝謝你的留言。我正在嘗試生成2D圖像。上面的相似圖像顯示物體以不同的顏色生長,表示不同的時間步長。但我不知道如何實現這一點,並重疊圖像,使我可以看到前方的增長。 –

+0

如果您想要在每次迭代中看到圖像增長,只需​​創建一個累加器變量,您可以在其中放置不斷增長的圖像並在每次迭代時繪製它。您需要調用'drawnow'才能看到它增長,也許需要一些'暫停'來控制循環的速度。 –

回答

1

我試圖手動構建蒙版。
有9個蒙版:第一個蒙版應用第一個顏色,第二個應用第二個顏色...
每個蒙版有1個,其中像素屬於區域,零區域不是。

請參閱下面的代碼示例,「生長」:

close all 

I = imread('CaNtG.jpg'); 
R0 = I(:, :, 1); %Red plane of I 
G0 = I(:, :, 2); %Green plane of I 
B0 = I(:, :, 3); %Blue plane of I 


%Build masks with ones for each stage. 
%Since I build the mask manaully, they are not perfect cut. 
matHVS = rgb2hsv(double(I)/255); 
H = round(matHVS(:, :, 1)*100); 
%figure;imagesc(uint8(H));impixelinfo 
Z = logical(zeros(size(H))); 
M1 = Z;M1((H >= 99)) = 1;M1(:, 535:end) = 0; 
M2 = Z;M2((H >= 8) & (H <= 11)) = 1;M2(:,1:330) = 0;M2(:, 615:end) = 0; 
M3 = Z;M3((H >= 12) & (H <= 25)) = 1;M3(:,1:330) = 0;M3(:, 615:end) = 0; 
M4 = Z;M4((H >= 26) & (H <= 37)) = 1;M4(:,1:529) = 0;M4(:, 755:end) = 0; 
M5 = Z;M5((H >= 38) & (H <= 54)) = 1;M5(:,1:593) = 0;M5(:, 818:end) = 0; 
M6 = Z;M6((H <= 1)) = 1;M6(:, 1:656) = 0;M6(:, 853:end) = 0; 
M7 = Z;M7((H >= 55) & (H <= 70)) = 1;M7(:,1:816) = 0;M7(:, 1099:end) = 0; 
M8 = Z;M8((H >= 71) & (H <= 90)) = 1;M8(:,1:893) = 0;M8(:, 1140:end) = 0; 
M9 = Z;M9((H >= 91)) = 1;M9(:,1:1045) = 0; 

%Create cell array of 9 masks. 
MM = {M1, M2, M3, M4, M5, M6, M7, M8, M9}; 

J = uint8(ones(size(I))*255); %J starts with all pixels white. 

R1 = J(:, :, 1); %Red plane of J 
G1 = J(:, :, 2); %Green plane of J 
B1 = J(:, :, 3); %Blue plane of J 

figure;imshow(J); 

for i = 1:9 
    M = MM{i}; %M aplies mask of current stage. 
    R1(M) = R0(M); 
    G1(M) = G0(M); 
    B1(M) = B0(M); 
    J = cat(3, R1, G1, B1); 
    imshow(J); 
    pause(1); 
    %imwrite(J, ['J', num2str(i), '.jpg']); 
end 

既然半手工建造的面具,結果是不完美的。
請注意:這只是一個例子。
我沒有盡力使其準確。

結果:

enter image description here


提高的結果,通過填充間隙和孔中的掩模:

更新代碼前面的代碼的擴張。
下面的代碼提高了掩模生成:

close all 

I = imread('CaNtG.jpg'); 
R0 = I(:, :, 1); %Red plane of I 
G0 = I(:, :, 2); %Green plane of I 
B0 = I(:, :, 3); %Blue plane of I 


%Build masks with ones for each stage. 
%Since I build the mask manaully, they are not perfect cut. 
matHVS = rgb2hsv(double(I)/255); 
H = round(matHVS(:, :, 1)*100); 
%figure;imagesc(uint8(H));impixelinfo 
Z = logical(zeros(size(H))); 
M1 = Z;M1((H >= 99)) = 1;M1(:, 535:end) = 0; %Red 
M2 = Z;M2((H >= 8) & (H <= 11)) = 1;M2(:,1:330) = 0;M2(:, 615:end) = 0; %Brown 
M3 = Z;M3((H >= 12) & (H <= 25)) = 1;M3(:,1:330) = 0;M3(:, 615:end) = 0; %Yellow 
M4 = Z;M4((H >= 26) & (H <= 37)) = 1;M4(:,1:529) = 0;M4(:, 755:end) = 0; %Green 
M5 = Z;M5((H >= 45) & (H <= 54)) = 1;M5(:,1:593) = 0;M5(:, 818:end) = 0; %Cyan 
M6 = Z;M6((H <= 44)) = 1;M6(:, 1:656) = 0;M6(:, 853:end) = 0;    %Gray 
M7 = Z;M7((H >= 55) & (H <= 65)) = 1;M7(:,1:816) = 0;M7(:, 1099:end) = 0; %Blue 
M8 = Z;M8((H >= 66) & (H <= 89)) = 1;M8(:,1:893) = 0;M8(:, 1140:end) = 0; %Magenta 
M9 = Z;M9((H >= 90)) = 1;M9(:,1:1045) = 0;        %Dark red 

%Create cell array of 9 masks. 
MM = {M1, M2, M3, M4, M5, M6, M7, M8, M9}; 


%Filling gaps between each two sequnital masks: 
%--------------------------------------- 
%For each mask row, find last "1" of first section, first "1" in next section. 
%Fill "1"s from up to the center from both sides. 
%      | | 
%      V V 
%M0:   111111111100000000000 
%M1:   000000000000001111111 
%Gap:     <-->   
%Fill M0: 111111111111000000000 
%Fill M1: 000000000000111111111 
for i = 1:length(MM)-1 
    M0 = MM{i}; %Mask of section i 
    M1 = MM{i+1}; %Mask of section i+1 

    %Fill gaps - fill each mask row separatelly 
    for y = 1:size(M0, 1) 
     x0 = find(M0(y, :) == 1, 1, 'last'); %Last non-zero index in row of M0 
     x1 = find(M1(y, :) == 1, 1, 'first'); %First non-zero index in row of M1 
     gap_size = x1 - x0 - 1; 
     if (gap_size > 0) 
      gap0 = round(gap_size/2); 
      gap1 = gap_size - gap0; 
      if (gap0 > 0), M0(y, x0+1:x0+gap0) = 1; end %Fill first half gaps in M0 
      if (gap1 > 0), M1(y, x1-gap1:x1-1) = 1; end %Fill second half gaps in M1 
     end 
    end 

    MM{i} = M0;  %Update cell array MM with "filled" M0. 
    MM{i+1} = M1; %Update cell array MM with "filled" M1. 
end 
%--------------------------------------- 

%Find left white section, and fill "1"s in W: 
%--------------------------------------- 
W = Z; 
M1 = MM{1}; 
for y = 1:size(M0, 1)  
    x = find(M1(y, :) == 1, 1); %Find fisrt non-zero element in row of M0. 
    W(y, 1:x) = 1; 
end 
%figure;imshow(W); 
%--------------------------------------- 

%Fill holes inside the masks 
%--------------------------------------- 
%A "hole" is a "0" that the value left to it is "1" 
%Fill hols with "1"s 
%      | | 
%      V V 
%M0:   11111111110000011111 
%Hole:     <---> 
%Fill hole: 11111111111111111111 
for i = 1:length(MM) 
    M0 = MM{i}; %Mask of section i 

    %Fill holds - fill each mask row separatelly 
    for y = 1:size(M0, 1) 
     x0 = find(M0(y, :) == 1, 1, 'last'); %Last non-zero index in row of M0 
     M0(y, 1:x0) = 1; %Fill all mask pixels to the left of the "1" with value "1". 
    end 

    M0(W == 1) = 0; %Erase W pixels from the first mask. 

    W(M0 == 1) = 1; %Add all "1"s in mask M0 to W (W keeps unuion of all left sections up to section i). 

    MM{i} = M0;  %Update cell array MM with "filled" M0. 
end 




J = uint8(ones(size(I))*255); %J starts with all pixels white. 

R1 = J(:, :, 1); %Red plane of J 
G1 = J(:, :, 2); %Green plane of J 
B1 = J(:, :, 3); %Blue plane of J 

figure;imshow(J); 

for i = 1:length(MM) 
    M = MM{i}; %M aplies mask of current stage. 
    R1(M) = R0(M); 
    G1(M) = G0(M); 
    B1(M) = B0(M); 
    J = cat(3, R1, G1, B1); 
    imshow(J); 
    pause(1); 
    %imwrite(J, ['J', num2str(i), '.jpg']); 
end 

結果:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here


從一組7個的圖像的產生類似的圖像:
下載圖片:https://www.dropbox.com/s/nxixlk5jw2glu0i/Images%20%282%29.zip?dl=0
這次我沒有填補空白。
我充滿了任意純色的部分:

num_parts = 7; 

MM = cell(1, num_parts); 

%Cell array of 7 colors to fill 
colors = {[0,0,255], [0,255,0], [255,0,0], [128, 128, 128], [0,255,255], [255,0,255], [255,255,0]}; 

%Load masks from files 1 (2).tif to 7 (2).tif. 
%Change mask format, and dimensions to match size and dimensions of I. 
for i = 1:num_parts 
    fname = [num2str(i), ' (2).tif']; %File name: 1 (2).tif to 7 (2).tif. 
    M = imread(fname); %Load image. 

    M = M(:, :, 1); %Keep the red color plane. 

    [y0, x0] = find(M ~= 255, 1); 
    [y1, x1] = find(M ~= 255, 1, 'last'); 

    M = M(y0:y1, x0:x1); %Crop the area that is not 255 (remove white background). 

    M = logical(M); %Convert to logical mask of zeros and ones. 

    MM{i} = M; 
end 

%Remove ovelap beetween masks (iterate from last mask backward): 
for i = length(MM):-1:2 
    MM{i}(MM{i-1}) = 0; 
end 


K = uint8(ones(size(M,1), size(M,2), 3)*255); %K starts with all pixels white. 

R = K(:, :, 1); %Red plane of K 
G = K(:, :, 2); %Green plane of K 
B = K(:, :, 3); %Blue plane of K 

figure;imshow(K); 

for i = 1:length(MM) 
    M = MM{i}; %M aplies mask of current stage. 
    R(M) = colors{i}(1); 
    G(M) = colors{i}(2); 
    B(M) = colors{i}(3); 
    K = uint8(cat(3, R, G, B)); 
    imshow(K); 
    pause(1); 
    %imwrite(K, ['K', num2str(i), '.jpg']); 
end 

最終結果:
enter image description here

+0

非常感謝您的幫助。 –

+0

除了以後在我的代碼中,我想通過重疊它們並將顏色與每個圖像相關聯,從一組7個圖像中生成一個相似的圖像。也可以用不同的圖像做到這一點嗎?鏈接是[link](https://www.dropbox.com/s/ecxd9dxlramjv8f/Images.zip?dl=0) –

+0

This [link](https://www.dropbox.com/s/nxixlk5jw2glu0i/Images %20%282%29.zip?dl = 0)移除了顏色條,這可能會更好。 –