由于签名中存在间隙,因此使用标准边界框算法将无法完全封装整个签名,因为当您检测到边界框时,笔划中的间隙将被解释为单个区域,因此将在那里检测到各个边界框。一种解决方法是简单地找到所有非零的像素,并找到最小和最大的行和列位置。您可以使用find
来帮助您实现这一目标。这些最小值和最大值将对应于封装此签名的整个边界框的左上角和右下角。
在我显示任何代码之前,我正在直接阅读您上传的图像,但它是RGB图像。因此,我将使用rgb2gray
将其转换为灰度,然后使用im2bw
对图像进行阈值处理。签名图像周围还有一个不必要的白色边框,所以我要用imclearborder
清除它。
不用多说了,这是代码:
%// Read in image and convert to binary
%// Also clear the borders
im = imread('http://oi59.tinypic.com/5fk9y0.jpg');
im_bw = imclearborder(im2bw(rgb2gray(im)));
%// Find those non-zero pixel locations
[rows, cols] = find(im_bw);
min_row = min(rows);
max_row = max(rows);
min_col = min(cols);
max_col = max(cols);
%// Now extract the bounding box
bb = im_bw(min_row:max_row, min_col:max_col);
%// Show the image
imshow(bb);
当你这样做时,bb
应该包含签名有界的图像,以便它完全适合图像。这是我显示bb
时得到的:
玩得开心!
为了防止Matlab不是一个严格的要求,或者如果你想轻松检查你的Matlab结果,或者其他任何人正在寻找谁买不起Matlab,那么在所有平台上都运行着非常强大的ImageMagick,使用命令行和Perl,Python,.NET,Ruby等的绑定。
我增加了图像周围的边框以进行正确的测试,并运行以下命令:
convert out.png -format "%@" info:
362x135+49+26
这告诉我你所寻找的边界框是362像素宽,135像素高,它的左上角偏向右边49像素,距离背景左上角26像素 - 所有这一切都在一个简单的命令中。
只是为了好玩,我可以使用以下命令以红色绘制该框:
convert out.png -stroke red -strokewidth 1 -fill none -draw "rectangle 49,26 410,160" box.png
所以它看起来像这样: