罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

罗兰谈MATLAB的艺术已存档,不会更新。

如何修改图像的背景?

今天我要介绍一位客座博主布雷特Shoelson.你们有些人可能认识Brett他提交的文件交换,或通过他参与本周精选博客,或从偶尔的嘉宾帖子上史蒂夫关于图像处理的博客

内容

“签证问题”

罗兰最近告诉我,她有一个即将到来的国际旅行,需要签证。她有一张照片的背景不适合她的签证文件,她问:“我怎么把背景改成白色呢?”

原图

第一个问题:我们如何分离背景?

“我想知道这是否需要创建一个手动面具?”罗兰问道。

好问题!我当然可以提出一种自动方法来屏蔽(或“分割”)感兴趣的区域(“ROI”)。例如:

Img = imread(“LorenVisaImage.png”);灰色= rgb2gray(img);SE = strel(“磁盘”1、4);morphologicalGradient = imsubtract(imdilate(灰色,SE), imerosion(灰色,SE));mask = im2bw(morphologicalGradient,0.03);SE = strel(“磁盘”、3、4);掩码= imclose(掩码,SE);掩码=填充(掩码,“黑洞”);Mask = bwareafilt(Mask,1);notMask = ~掩码;掩码=掩码| bwpropfilt“区域”,[- inf, 5000 - eps(5000)]);showMaskAsOverlay(0.5,面具,“r”);
%(showMaskAsOverlay是我的辅助函数,可在MATLAB中央文件交换。)

然而,罗兰夹克的边缘部分几乎和背景完全一样的颜色,这让情况变得复杂。如果她站在绿色或蓝色的屏幕前,自动化操作就容易得多色度键合成操作背景。相反,我必须通过一些障碍才能到达那里。

自动化的努力是合理的吗?

每当您面临这样的任务时,值得考虑一下自动化任务所需要的投资的潜在回报。如果您需要处理许多相似的图像——例如,如果这是一帧视频——您可能确实希望花费所需的精力来自动化分割过程。另一方面,如果任务是一次性的(就像在这种情况下),手动操作可能确实更容易、更快,而且可能更准确。为此,我们的>createMask方法imroi工具促进了这一过程。

创建上面的代码片段需要一些努力。用花了几分钟:

H = impoly(imgca,“关闭”、假);

我更喜欢和你一起工作与人合作imfreehand因为前者在事后更容易调整。与imfreehand在美国,我发现自己多次追踪边界,试图做到正确。但随着,我可以点击,然后调整各个顶点。我甚至可以删除或添加顶点(通过按“A”键)根据需要遵循困难的轮廓。

我也更喜欢和开放imroi区域划分有几个原因。首先,面具是由imroi.createMask默认情况下自动关闭:

改进口罩

嗯。这并不相当给我我想要的面具。我要修改对象,将其约束到图像区域:

fcn = makeConstrainToRectFcn(“不”得到(imgca“XLim”), (imgca“YLim”));setPositionConstraintFcn (h, fcn);

然后我要添加几个顶点,并把它们放到最下面的角上:

现在面具看起来更适合我的任务:

(我添加了红色边框只是为了说明面具是如何变化的。)

修改背景

现在,当然,在MATLAB中设置背景为白色是相对容易的。对于一个灰度图像,我们可以直接使用蒙版:

灰色= rgb2gray(img);灰色(~mask) = 255;imshow(灰色)%(图片为uint8类;255是uint8图像的“white”值。)

还有两个问题……

首先,罗兰的形象不是灰度。我们需要在平面上应用屏蔽函数。第二,即使仔细绘制区域,我们想要保留的区域(即Loren)和背景之间的界面是相当块状的,并不是很令人满意:

(好吧,也许对于一张2英寸x2英寸的签证照片来说已经足够好了。但就我们的目的而言,假设我们对此并不满意。)

Planewise操作

对于第一个问题,我们可以很容易地将图像分解为平面组件,应用蒙版,然后重建彩色图像:

分解和屏蔽飞机:R = img(:,:,1);G = img(:,:,2);B = img(:,:,3);R (~mask) = 255;G (~mask) = 255;B (~mask) = 255;重建RGB映像:Img = cat(3,r,g,b);imshow (img)

修复接口

为了解决第二个问题(块状接口),我将回忆一个最近的讨论我在本周精选博客.捕获我在那篇博客文章中讨论的代码作为函数,并使用相同的代码我可以创建一个自定义的“外壳掩码”的劳伦后台接口:

shellMask = createShellMask(h,“厚度”3);imshow (shellMask);

我为什么要这么做?因为现在我可以用优秀的regionfill的功能图像处理工具箱使用掩码向内插值:

r = regionfill(r,shellMask);g = regionfill(g,shellMask);b = regionfill(b,shellMask);Img = cat(3,r,g,b);imshow (img)

果不其然!我们成功地“软化”了界面,创造了一张看起来更自然的照片:

最后一点

我很想知道是否createShellMask是否对其他人有用,以及是否应该在文件交换中共享。此外,我在上面的平面分析中采用的方法(掩蔽,和regionfill)是相当通用的,并且很容易转换成函数:

Imgout = planwise (fcnhandle,rgbimg,varargin)

如果这看起来对你有用,让我知道,我也会张贴!让我知道在这里

matlab快乐!




MATLAB®R2015a发布


  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。

Baidu
map