在Matlab中重叠图像

时间:2016-08-02 10:42:17

标签: image matlab matlab-figure overlap

我试图在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',...重叠,以显示随时间增长的对象,每个图像分配不同的颜色背景删除(白色)。任何帮助实现这一点将不胜感激。

关于如何使用每个时间步前面之间的图像找到距离的进一步指导将非常感激。谢谢。

1 个答案:

答案 0 :(得分:1)

我试图手动制作面具 有9个面具:第一个蒙版应用第一种颜色,第二种应用第二种颜色...
每个掩码都有1个像素属于section而零则没有。

请参阅以下代码示例" grow":

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