答案 0 :(得分:4)
由于签名中存在间隙,使用标准边界框算法将无法完全封装整个签名,因为当您检测到边界框时,笔划中的间隙将被解释为单个区域,因此各个边界框将是在那里检测到一种解决方法是简单地找到所有非零的像素,并找到最小和最大的行和列位置。您可以使用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
时的结果:
玩得开心!
答案 1 :(得分:2)
为了防止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
所以它看起来像这样: