我有2张图片。一个是背景图像,其他图像具有相同的背景但具有一些前景对象。我想从背景中提取前景对象。 matlab中的简单减法操作是不够的,因为它从前景图像中减去背景图像的RGB值(如下面的代码所示)。
im1 = imread('output/frame-1.jpg')
im2 = imread('output/frame-7.jpg')
%# subtract
deltaImage = im1 - im2;
imshow(deltaImage)
因此,如果背景颜色为白色且前景对象为蓝色,则输出(即deltaImage)将带有橙色颜色的前景对象黑色背景。然而,我想要的输出是前景对象,其中 蓝色 颜色(即原始颜色)具有 黑色 背景。我怎么能得到这个?我尝试使用下面的代码来做,但输出图像不正确。
im1 = imread('foreground.jpg')
im2 = imread('background.jpg')
[m n k]=size(im2);
deltaImage = zeros(m,n,3);
fprintf('%d %d %d.\n',m,n,k);
for l=1:k
for i=1:m-1
for j=1:n-1
if im1(i:j:l)~=im2(i:j:l)
deltaImage(i,j,l) = im1(i,j,l);
end
end
end
end
imshow(deltaImage)
答案 0 :(得分:2)
您可以使用deltaImage
创建一个与前景相乘的蒙版(零和一个图像)。但请注意,您将拥有与有损图像压缩相关联的工件(.jpeg
)。如果您使用阈值(如平均差值或您想要的特定值),可以减少到某种程度。试试这个:
im1 = double(imread('~/Downloads/foreground.jpg'));
im2 = double(imread('~/Downloads/background.jpg'));
计算3个通道平均值的差异
deltaImage = mean(im2,3) - mean(im1,3);
然后使用平均值乘以标准偏差(~3
),或取消注释下面的行以使用特定阈值,例如128
mask = deltaImage>3*mean(deltaImage(:));
% mask = deltaImage>128;
然后假设所有原始图像都是8位格式,也产生8位格式的结果:
result = uint8(cat(3, im1(:,:,1).*mask, im1(:,:,2).*mask, im1(:,:,3).*mask));
imshow(result)
这是你应该得到的结果:
再次主要对象周围奇怪的像素是有损图像压缩的伪像(.jpeg
),你应该尝试使用无损的.png
格式。