matlab环境下的前景提取

matlab环境下的前景提取,matlab,image-processing,Matlab,Image Processing,我有两张照片。一个是背景图像,另一个图像有相同的背景,但有一些前景对象。我想从背景中提取前景对象。matlab中简单的减法运算是不够的,因为它将背景图像的RGB值从前景图像的RGB值中减去(如下代码所示) 因此,如果背景颜色为白色,前景对象为蓝色,则输出(即三角图像)的前景对象为橙色,背景颜色为黑色。然而,我想要的输出是带有蓝色背景的前景对象(即原始颜色)。我怎么能得到这个?我试图用下面的代码来做,但输出的图像不正确 im1 = imread('foreground.jpg') im2 = im

我有两张照片。一个是背景图像,另一个图像有相同的背景,但有一些前景对象。我想从背景中提取前景对象。matlab中简单的减法运算是不够的,因为它将背景图像的RGB值从前景图像的RGB值中减去(如下代码所示)

因此,如果背景颜色为白色,前景对象为蓝色,则输出(即三角图像)的前景对象为橙色,背景颜色为黑色。然而,我想要的输出是带有蓝色背景的前景对象(即原始颜色)。我怎么能得到这个?我试图用下面的代码来做,但输出的图像不正确

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)
  • 背景图像
  • 前景图像
  • 输出图像(这里我希望人的颜色是蓝色)

  • 您可以使用
    deltaImage
    创建一个与前景相乘的遮罩(0和1图像)。但是,请注意,您将有与有损图像压缩相关联的瑕疵(
    .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
    格式。

    您可以使用
    deltaImage
    创建一个放大前景的遮罩(0和1图像)。但是,请注意,您将有与有损图像压缩相关联的瑕疵(
    .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
    格式。

    仅在像素相等时减去背景图像?@hari_OM那么,您喜欢我的答案吗?有问题吗?评论?如果像素相等,只减去背景图像?@hari_OM,你喜欢我的答案吗?有问题吗?注释?我使用.*整数只能与同一类的整数或标量双精度组合得到错误。。所以我做了这个改变:
    result=double(im1)。*mask运行代码后,我得到如下输出:[work4hari.net78.net/stackoverflow/output1.jpg]()@hari_OM结果很奇怪,有很多由压缩不良引起的瑕疵。我已经编辑了答案,希望你能接受。我使用了你的方法,得到了与你展示的类似的输出。然而,我在
    .png
    格式上尝试了您的方法,但仍然在输出中受到干扰。出现的另一个问题是,当我们做
    deltaImage=im1-im2,它们的输出中没有杂讯。我使用。*整数只能与同一类的整数或标量双精度的整数组合。。所以我做了这个改变:
    result=double(im1)。*mask运行代码后,我得到如下输出:[work4hari.net78.net/stackoverflow/output1.jpg]()@hari_OM结果很奇怪,有很多由压缩不良引起的瑕疵。我已经编辑了答案,希望你能接受。我使用了你的方法,得到了与你展示的类似的输出。然而,我在
    .png
    格式上尝试了您的方法,但仍然在输出中受到干扰。出现的另一个问题是,当我们做
    deltaImage=im1-im2,它们的输出中没有噪声。