如何修改图片的背景?
今天我想介绍一下客人的博客布雷特Shoelson。你们中的一些人可能知道布雷特他的文件交换意见,或者通过他的参与选择的博客,或者偶尔的客座文章史蒂夫对图像处理的博客。
内容
“签证问题”
罗兰最近告诉我她有一个等待国际旅行,需要签证。她有照片的背景是不适合使用在她的签证文件,她问道:“我怎么改变背景白色呢?”
原始的照片
第一个问题:我们如何隔离背景?
“我不知道这将意味着创建一个手动面具?”,罗兰问道。
好问题!我可以想出一个自动化的方法屏蔽(或“分段”)感兴趣的区域(ROI)。例如:
img = imread (“LorenVisaImage.png”);灰色= rgb2gray (img);SE = strel (“磁盘”1、4);morphologicalGradient = imsubtract (imdilate(灰色,SE) imerode(灰色,SE));掩码= im2bw (morphologicalGradient, 0.03);SE = strel (“磁盘”、3、4);掩码= imclose(面具,SE);= imfill(面具,面具“黑洞”);掩码= bwareafilt(面具,1);notMask = ~面具;掩码=面具| bwpropfilt (notMask“区域”(负5000 - eps (5000)));showMaskAsOverlay(0.5,面具,“r”);
% (showMaskAsOverlay是我的helper函数,在MATLAB中央文件交换。)
然而,复杂的边界部分罗兰的夹克几乎完全相同的颜色作为背景。如果她一直站着对绿色或蓝色屏幕相反,这将是更容易实现自动化色度键合成操纵背景。相反,我必须跳过一些步骤。
是自动化的努力合理吗?
当你正面临着这样的一个任务,值得思考一下潜在的投资回报,需要自动化任务。如果你需要处理很多类似的图像,如果这是一个帧的视频,例如,你可能的确想花力气就能自动分割过程。另一方面,如果任务是一次性(在本例中),这可能确实更容易,更快,更准确的手动去做事情。为此,我们> createMask方法imroi工具促进这个过程。
创建上面的代码片段中带一点努力。重新创建它不花了几分钟:
h =不(imgca,“关闭”、假);
我更喜欢工作不与imfreehand,因为前者是更容易调整后的事实。与imfreehand,我发现自己多次跟踪边界,试图使它正确。但随着不我可以点击,然后调整个人的顶点。我甚至可以删除或添加顶点(通过按“”键),需要遵循困难的轮廓。
我也喜欢工作开放imroi地区的几个原因。首先,创建的面具imroi.createMask默认自动关闭:
改善面具
嗯。这并不相当给我我想要的面具。我要修改不对象通过约束的图像区域:
fcn = makeConstrainToRectFcn (“不”得到(imgca“XLim”),(imgca“YLim”));setPositionConstraintFcn (h, fcn);
然后我要添加两个顶点,并把它们底部角落:
现在面具看起来更适合我的任务:
(我添加红色边境澄清一下面具如何改变)。
修改背景
当然,将背景设置为白色在MATLAB相对比较容易。对于一个灰度图像,我们可以直接使用面具:
灰色= rgb2gray (img);灰色(~面具)= 255;imshow(灰色)%(类uint8的图像;255年的值是“白色”uint8图像。)
两个问题依然存在…
首先,罗兰的形象不是灰度。我们需要应用planewise屏蔽功能。第二,即使是精心绘制不区域,地区之间的界面我们想保持(即。,Loren) and the background is pretty blocky, and not very satisfying:
(好吧,也许是足够好的2“x2”签证照片。但是对于我们的目的,假设我们不满意)。
Planewise操作
对于第一个问题,我们可以很容易的图像分解成其planewise组件,应用面罩,然后重建彩色图像:
%分解和面具的飞机:r = img (:,: 1);g = img (:,:, 2);b = img (:,:, 3);r(~面具)= 255;g(~面具)= 255;b(~面具)= 255;%重建RGB图像:img =猫(r, g, b);imshow (img)
固定的接口
解决第二个问题(块状接口),我要召回最近的讨论我有在选择的博客。捕获代码我博客中讨论的一个函数,并使用相同的不我创建了上面,我可以创建一个定制的“壳”的面具Loren-background接口:
shellMask = createShellMask (h,“厚度”3);imshow (shellMask);
我为什么要这样做?因为现在我可以使用好regionfill的函数图像处理工具箱向内插入使用掩码:
(r, r = regionfill shellMask);g = regionfill (g, shellMask);b = regionfill (b, shellMask);img =猫(r, g, b);imshow (img)
果不其然!我们已经成功地“软化”接口和创建一个更自然的照片:
最后一个注意
我对听力是否感兴趣createShellMask是对别人有用,我是否应该共享文件交换。另外,上面的方法我把planewise分析(掩蔽,regionfill)是相当一般,很容易转化为一个函数:
imgout = planewise (fcnhandle rgbimg变长度输入宗量)
如果这看起来对你有用,请让我知道,我会发布!请让我知道在这里。
matlab快乐!
- 범주:
- 图像处理
댓글
댓글을남기려면링크를클릭하여MathWorks계정에로그인하거나계정을새로만드십시오。