如何旋转连接的组件,使它们在 Matlab 中直立?
How can I rotate connected components so that they are upright in Matlab?
目前我正在使用数独网格并且我有二进制图像。我正在使用 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
是 return 从 regionprops
编辑的对象,包含连通分量的面积
我知道我可以在获取 OCR 结果之前旋转图像:
im_out = imrotate(im_out, angle)
但是我不知道网格的角度是多少,因为这是循环遍历多个图像的函数的一部分。我查看了 regionprops
方法,因为有一个属性 'Orientation' 我可以从那里提取,但我不明白我将如何实际使用它。它还指出 regionprops
将 return 一个介于 -90 和 90 之间的值,但我的图像可以旋转超过 90 度。
不要旋转连通分量或二值图像。先用二值图像确定旋转,然后对原始灰度或彩色输入图像进行旋转,再对旋转后的图像进行二值化处理。您将能够使用插值进行转换,这将大大改善您的结果。它确实需要执行两次二值化步骤,但我认为这一步通常不会太昂贵。
regionprops
方向特征由 "fitting" 形状的椭圆计算得出。这仅对细长对象有意义。对于方形数独网格,这不会产生任何有价值的信息。
相反,查看获得最小费雷特直径的角度。 Feret 直径是投影在任意角度的长度。从一个角度看,这个投影是最小的。必要时,它将与正方形的其中一个主轴成一定角度。 Here is more information about how to compute Feret diameters in MATLAB.
另一种选择是例如使用霍夫变换来检测网格的线。
请注意,拼图的几何形状永远不会告诉您哪一面朝上。你在这里得到的角度应该以 π/2 为模(即限制在 -π/4 到 π/4 的范围内)。
要知道向上的方向,您可以尝试阅读文本,如果失败,请旋转 90 度并重试。
目前我正在使用数独网格并且我有二进制图像。我正在使用 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
是 return 从 regionprops
编辑的对象,包含连通分量的面积
我知道我可以在获取 OCR 结果之前旋转图像:
im_out = imrotate(im_out, angle)
但是我不知道网格的角度是多少,因为这是循环遍历多个图像的函数的一部分。我查看了 regionprops
方法,因为有一个属性 'Orientation' 我可以从那里提取,但我不明白我将如何实际使用它。它还指出 regionprops
将 return 一个介于 -90 和 90 之间的值,但我的图像可以旋转超过 90 度。
不要旋转连通分量或二值图像。先用二值图像确定旋转,然后对原始灰度或彩色输入图像进行旋转,再对旋转后的图像进行二值化处理。您将能够使用插值进行转换,这将大大改善您的结果。它确实需要执行两次二值化步骤,但我认为这一步通常不会太昂贵。
regionprops
方向特征由 "fitting" 形状的椭圆计算得出。这仅对细长对象有意义。对于方形数独网格,这不会产生任何有价值的信息。
相反,查看获得最小费雷特直径的角度。 Feret 直径是投影在任意角度的长度。从一个角度看,这个投影是最小的。必要时,它将与正方形的其中一个主轴成一定角度。 Here is more information about how to compute Feret diameters in MATLAB.
另一种选择是例如使用霍夫变换来检测网格的线。
请注意,拼图的几何形状永远不会告诉您哪一面朝上。你在这里得到的角度应该以 π/2 为模(即限制在 -π/4 到 π/4 的范围内)。
要知道向上的方向,您可以尝试阅读文本,如果失败,请旋转 90 度并重试。