如何旋转连接的组件,使它们在Matlab中直立?

时间:2018-04-17 04:00:58

标签: matlab rotation image-rotation binary-image

目前我正在使用数独网格,我有二进制图像。我使用Regionprops来获取连接组件的区域,然后将图像的其余部分变为黑色。在此之后,我调用OCR方法尝试读取数独数字。问题是,只有当图像中的数独网格是直的并且直立时,这才有效。如果它旋转甚至一点点,我无法拉动数字。这是我到目前为止的代码:

% get grid connected parts
conn_part = bwconncomp(im_binary);

% blacken area outside
stats = regionprops(conn_part,'Area'); 
im_out = im_binary;  % Make mask
im_out(vertcat(conn_part.PixelIdxList{[stats.Area] < 825 | [stats.Area] > 2500})) = 0; 

imagesc(im_out); 
title("Numbers pulled");
sudokuNum = ocr(im_out,'TextLayout','Block','CharacterSet','0123456789');
sudokuNum.Text;

其中im_binary是二进制图像

im_out是输出图像

stats是从regionprops返回的包含连接组件区域的对象

我知道我可以在获得OCR结果之前旋转图像:

im_out = imrotate(im_out, angle)

但是我不知道网格的角度,因为这是一个为多个图像循环的函数的一部分。我查看了regionprops方法,因为它有一个属性&#39; Orientation&#39;我可以从那里拉,但我不明白我将如何使用它。它还指出regionprops将返回-90到90之间的值,但我的图像可以旋转90度以上。

1 个答案:

答案 0 :(得分:1)

不要旋转连接的组件或二进制图像。首先使用二进制图像确定旋转,然后旋转原始灰度或彩色输入图像,然后将旋转后的图像二值化。您将能够使用插值进行变换,这将极大地改善您的结果。它确实需要进行两次二值化​​步骤,但我认为这一步通常不太昂贵。

通过将椭圆“拟合”到形状来计算regionprops方向特征。这仅对细长物体有意义。对于方形数独网格,这不会产生任何有价值的信息。

相反,请查看获得最小Feret直径的角度。 Feret直径是任意角度的投影长度。在一个角度,这个投影是最小的。必要时,它将与该正方形的一个主轴相对应。 Here is more information about how to compute Feret diameters in MATLAB

另一种选择是使用霍夫变换来检测网格线。

请注意,拼图的几何图形永远不会告诉您哪一面朝上。你在这里得到的角度应该是模数π/ 2(即约束到-π/ 4到π/ 4的范围)。

要了解您可能通过尝试阅读文本的方向,如果失败,请旋转90度然后重试。