我正在使用一个允许我在图像上徒手绘制的代码。代码如下:
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)。但是在输出图(图2)中,它只显示了我绘制的最后一个数字。我想展示我画的所有写意人物。任何人都可以建议我如何改进代码,所以无论我在pic1上画什么都将在pic2上显示。谢谢。
答案 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运算(即|
)在您循环并创建新的笔划时更新每个笔划的掩码。当我进行上述修改时,我现在在我尝试在保存之前复制你的笔画时得到这个图像: