给图像一个黑色的背景?
的问题,如安德烈预告是不是所有的背景像素都是“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压缩。如果它是白色桌子上的水果的自然形象,任何数字l相机现在做这种效果。 – 2012-02-07 20:01:47
在相机上,这也是由于JPEG压缩而发生的。但是,在专业或半专业相机中,您可以选择保存照片而不进行压缩(也称为原始格式)。那么你不会得到那种效果。 – 2012-02-07 20:04:39
即使在自定义处理为RAW图像的RAW图像中,您也会得到它。这是一个光学和传感器限制的自然属性(查看MTF/PSF) - http://www.imatest.com/docs/sharpness/ – 2012-02-07 20:06:47
肯定。 如果您的图像保存为一个变量,名为IMG:
thr = 255;
mask = sum(img,3)==thr*3;
for i=1:3
c = img(:,:,i);
c(mask)=0;
img(:,:,i)=c;
end
| - )
你失败的原因是模糊的边缘图像的抗锯齿效果。这些未被移除的像素不是255!他们有点低。基本上你有2个选项:
(我从使用Matlab的角度写他们)。
- 使用
imfreehand
选择相关的部分,然后从API调用createMask
创建模板。 - 找到正确的门限电平,这是不是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
您应该绘制图像的黑色背景。
//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);
我花了一段时间才意识到这实际上是一种水果,而不是某种计算机生成的熔岩行星图像。我想我需要关掉“星际迷航”,然后去吃一次健康的东西。 – Polynomial 2012-02-07 15:29:49
你不能迭代图像像素,并将所有的白色像素变为黑色? – 2012-02-07 15:35:27
@Polynomial哈哈! – vini 2012-02-07 15:44:12