【问题标题】:Giving an image a black background?给图像一个黑色背景?
【发布时间】:2012-02-29 00:55:20
【问题描述】:

有什么方法可以在 MATLAB 中去除白色背景并将其变为黑色?

假设我有这张图片:

当我应用答案中建议的代码时,我得到以下输出:这并不完美

【问题讨论】:

  • 我花了一段时间才意识到这实际上是一种水果,而不是某种计算机生成的熔岩星球图像。我想我需要关掉《星际迷航》,去吃一次健康的东西。
  • 您不能遍历图像像素并将所有白色像素更改为黑色吗?
  • @PulkitGoyal 我认为可以做到
  • 检查这个问题,看看它是否有帮助:stackoverflow.com/questions/8041703/…

标签: image matlab image-processing opencv


【解决方案1】:

正如 Andrey 所注意到的,问题在于并非所有背景像素都是“255 白色”。这可能是由于 JPEG 压缩算法造成的,也可能是因为图像中有水果的阴影。

为了解决这个问题,首先通过模糊图像获得水果区域的二进制掩码(这是克服 JPEG 伪影所必需的),然后对图像进行阈值处理,该值非常高,但略低于 255。这里是Matlab中的解决方案:

I = imread('http://i.stack.imgur.com/5p4jV.jpg'); % Load your image.
H = fspecial('gaussian'); % Create the filter kernel.
I = imfilter(I,H); % Blur the image.

Mask = im2bw(Ig, 0.9); % Now we are generating the binary mask.
I([Mask, Mask, Mask]) = 0; % Now we have the image.

这是输出(您也可以在 im2bw 中尝试不同的阈值):

【讨论】:

  • 好帖子 (+1)。顺便说一句,它不一定是由于 JPEG 压缩。如果是白桌上水果的自然图像,现在的任何数码相机都有这种效果。
  • 在相机上,由于 JPEG 压缩也会发生这种情况。但是,在专业或半专业相机中,您可以选择不压缩(也称为原始格式)保存照片。那你就得不到那种效果了。
  • 即使在对位图进行自定义处理的 RAW 图像中,您也会得到它。这是光学和传感器限制的自然属性(查看 MTF/PSF)-imatest.com/docs/sharpness
  • 更不用说会出现在白色背景上的噪点,会导致一些白色像素变得几乎是白色的。
【解决方案2】:

由于抗锯齿效果模糊了图像的边缘,您失败了。这些没有被移除的像素不是255!它们有点低。基本上你有两个选择:

(我是从使用Matlab的角度写的)。

  1. 使用imfreehand 选择相关部分,然后通过API 调用createMask 创建掩码。
  2. 找到正确的阈值水平,不是 255。(更难 - 如果可能的话)

这是第一个的Matlab代码:

function SO1
    im = imread('c:\x.jpg');
    figure();
    imshow(im);
    f = imfreehand();
    mask = f.createMask();
    mask = repmat(mask,[1 1 3]);
    im(~mask) = 0;
    figure;imshow(im);
end

【讨论】:

    【解决方案3】:

    您应该将图像绘制为黑色背景。

    //Your bitmap
    Bitmap originalImage = new Bitmap(100, 100);
    
    //Black background
    Bitmap bitmap = new Bitmap(100, 100);
    Graphics g = Graphics.FromImage(bitmap);
    
    //Draw the background
    g.FillRectangle(Brushes.Black, 0, 0, 100, 100);
    
    //Draw the original bitmap over the black one
    g.DrawImage(originalImage, 0, 0);
    

    【讨论】:

      【解决方案4】:

      是的。 如果您的图像保存为名为 img 的变量:

      thr = 255;
      mask = sum(img,3)==thr*3;
      for i=1:3
          c = img(:,:,i);
          c(mask)=0;
          img(:,:,i)=c;
      end
      

      |-)

      【讨论】:

      • 此算法无法解决问题:输出将与问题中显示的第二张图像相同。
      • 尝试将 thr 从 255 更改为更小的值(第二行更改为:mask = sum(img,3)>=thr*3
      • 或者使用与背景的距离测量:thr =200; img = 双(img); d = (255-img).^2; d = sqrt(sum(d,3)); d(d>thr)=thr; d = d/thr; newImg = img.* repmat(d,[1 1 3]);图像(uint8(newImg));
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      相关资源
      最近更新 更多