有没有办法在MATLAB中删除白色背景并将其变成黑色?
说我有这个形象:
当我应用答案中建议的代码时,我得到以下输出:哪个不完美
答案 0 :(得分: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中尝试不同的阈值):
答案 1 :(得分:2)
由于抗锯齿效果使图像边缘模糊,因此失败。这些未被删除的像素不是255!他们有点低。基本上你有两个选择:
(我是从使用Matlab的角度写的。)
imfreehand
选择相关部分,然后通过从API调用createMask
创建一个掩码。这是第一个的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
答案 2 :(得分: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);
答案 3 :(得分:-1)
是肯定的。 如果您的图像保存为名为img的变量:
thr = 255;
mask = sum(img,3)==thr*3;
for i=1:3
c = img(:,:,i);
c(mask)=0;
img(:,:,i)=c;
end
| - )