我需要获取二进制图像内部角色的外围边缘。我有一张信<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="container">
<xsl:copy>
<xsl:for-each-group select="*" group-by="node-name(.)">
<xsl:for-each-group select="current-group()" group-by=".">
<xsl:copy>
<xsl:copy-of select="current-group()/@*"/>
</xsl:copy>
</xsl:for-each-group>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:transform>
的图片。该图像是二进制矩阵。我已将图像二值化,并将其保存在20 x 20矩阵中。我想只获得外部“ON”像素。
总之,我有这张图片:
...我想要这张图片:
在MATLAB中执行此操作的最佳方法是什么?
答案 0 :(得分:1)
我假设你安装了图像处理工具箱。您上传的示例图像是RGB,因此必须进行一些预处理。首先,读入图像,然后将图像转换为二进制。
对于我提议的工作,对象像素需要是白色的,因此您需要反转图像,使其在黑色背景上为白色文本。完成此操作后,填写任何孔,找到周边,然后重新转换回原始配色方案。
您可能还需要加粗生成的边界,因为这只会找到1像素宽的边界。您的示例显示周长为几个像素的厚度。使用方形结构元素的扩张可以在这里提供帮助。
%// Read in image, convert to binary and invert
im = imread('http://i.stack.imgur.com/ooWFP.jpg');
im = ~im2bw(im);
%// Fill in holes
im_fill = imfill(im, 'holes');
%// Find perimeter
out = bwperim(im_fill);
%// Expand the perimeter and reinvert
out = ~imdilate(out, strel('square', 5));
%// Show image
imshow(out);
我们得到了这个: