罗兰在MATLAB的艺术

把想法变成MATLAB

请注意

罗兰在MATLAB的艺术已经存档,不会被更新。

如何修改图片的背景?

今天我想介绍一下客人的博客布雷特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快乐!




发表与MATLAB®R2015a


  • 打印
  • 发送电子邮件

댓글

댓글을남기려면링크를클릭하여MathWorks계정에로그인하거나계정을새로만드십시오。