在matlab

时间:2016-02-10 14:55:34

标签: matlab image-processing

我有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)
  1. 背景图片
  2. enter image description here

    1. 前景图片
    2. enter image description here

      1. 输出图像(这里我希望人的颜色为蓝色)
      2. enter image description here

1 个答案:

答案 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)

这是你应该得到的结果:

output

再次主要对象周围奇怪的像素是有损图像压缩的伪像(.jpeg),你应该尝试使用无损的.png格式。