如何显示我通过imfreehand

时间:2016-05-23 22:48:18

标签: image matlab image-processing

我正在使用一个允许我在图像上徒手绘制的代码。代码如下:

I = imread('peppers.png');
imshow(I);
for i=1:3
    M = imfreehand(gca,'Closed',0);
    F = false(size(M.createMask));
end
P0 = M.getPosition;
D = round([0; cumsum(sum(abs(diff(P0)),2))]); 
P = interp1(D,P0,D(1):.5:D(end)); 
P = unique(round(P),'rows');
S = sub2ind(size(I),P(:,2),P(:,1));
F(S) = true;
figure;
imshow(F);
imwrite(F,'line.jpg')

图片1

pic1

图片2

pic2

使用上面的代码,我可以在照片上按照自己的意愿绘制(图1)。但是在输出图(图2)中,它只显示了我绘制的最后一个数字。我想展示我画的所有写意人物。任何人都可以建议我如何改进代码,所以无论我在pic1上画什么都将在pic2上显示。谢谢。

1 个答案:

答案 0 :(得分:2)

这只是循环结束的问题(即end语法),因此您需要在每次迭代后设置掩码。你正在做的是捕获所有笔划,但你重置包含每次迭代笔划的蒙版。因此,您只捕获最后一次迭代的笔划。

你需要解决这个问题,一旦你做了,你还需要一个外部遮罩变量记住每个笔划,然后这是你最后保存的最后一个遮罩变量

我对您的代码的编辑如下所示:

close all;
I = imread('peppers.png');
figure;
imshow(I);

%// New - Create external mask variable that remembers each stroke in the loop
mask = false(size(I,1), size(I,2));

for i=1:3
    M = imfreehand(gca,'Closed',0);
    F = false(size(M.createMask));
    P0 = M.getPosition;
    D = round([0; cumsum(sum(abs(diff(P0)),2))]); 
    P = interp1(D,P0,D(1):.5:D(end)); 
    P = unique(round(P),'rows');
    S = sub2ind(size(I),P(:,2),P(:,1));
    F(S) = true;

    %// Save stroke into external mask
    mask = mask | F;
end %// Move end statement here

%// Show mask then save
figure;
imshow(mask);
imwrite(mask,'line.jpg');

逻辑OR运算(即|)在您循环并创建新的笔划时更新每个笔划的掩码。当我进行上述修改时,我现在在我尝试在保存之前复制你的笔画时得到这个图像:

enter image description here

enter image description here