2012-02-07 140 views
2

是否有任何方法去除白色背景并在MATLAB中将它变成黑色?给图像一个黑色的背景?

说我有这样的形象:

enter image description here

我得到以下输出当我申请的代码在回答提示:这是不完美的

enter image description here

+7

我花了一段时间才意识到这实际上是一种水果,而不是某种计算机生成的熔岩行星图像。我想我需要关掉“星际迷航”,然后去吃一次健康的东西。 – Polynomial 2012-02-07 15:29:49

+0

你不能迭代图像像素,并将所有的白色像素变为黑色? – 2012-02-07 15:35:27

+1

@Polynomial哈哈! – vini 2012-02-07 15:44:12

回答

6

的问题,如安德烈预告是不是所有的背景像素都是“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不同的阈值):

enter image description here

+1

好后(1)顺便说一下,它不必须是由于JPEG压缩。如果它是白色桌子上的水果的自然形象,任何数字l相机现在做这种效果。 – 2012-02-07 20:01:47

+0

在相机上,这也是由于JPEG压缩而发生的。但是,在专业或半专业相机中,您可以选择保存照片而不进行压缩(也称为原始格式)。那么你不会得到那种效果。 – 2012-02-07 20:04:39

+3

即使在自定义处理为RAW图像的RAW图像中,您也会得到它。这是一个光学和传感器限制的自然属性(查看MTF/PSF) - http://www.imatest.com/docs/sharpness/ – 2012-02-07 20:06:47

-1

肯定。 如果您的图像保存为一个变量,名为IMG:

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

| - )

+0

嘿c编辑.. – vini 2012-02-07 17:49:16

+0

这个算法没有解决问题:输出将与问题中显示的第二个图像相同。 – 2012-02-07 19:22:15

+0

尝试从255改变THR到财产以后较小 (以及第二行: 掩模=总和(IMG,3)> = THR从背景测量* 3 – Mercury 2012-02-08 06:22:39

2

你失败的原因是模糊的边缘图像的抗锯齿效果。这些未被移除的像素不是255!他们有点低。基本上你有2个选项:

(我从使用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 
0

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

//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);