【问题标题】:How can I rotate connected components so that they are upright in Matlab?如何旋转连接的组件以使它们在 Matlab 中直立?
【发布时间】:2018-04-17 04:00:57
【问题描述】:

目前我正在使用数独网格并且我有二进制图像。我正在使用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 方法,因为我可以从那里拉出一个属性“方向”,但我不明白我将如何实际使用它。它还指出regionprops 将返回一个介于 -90 和 90 之间的值,但我的图像可以旋转 90 度以上。

【问题讨论】:

    标签: matlab rotation image-rotation binary-image


    【解决方案1】:

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

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

    相反,查看获得最小费雷特直径的角度。费雷特直径是任意角度的投影长度。在一个角度,这个投影是最小的。必然地,它将处于对应于正方形主轴之一的角度。 Here is more information about how to compute Feret diameters in MATLAB.

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

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

    要知道向上的方向,您可以尝试阅读文本,如果失败,请旋转 90 度并重试。

    【讨论】:

    • 好的,但是我怎么知道每张图片要旋转多少?当它是灰度图像时,我不知道网格的方向,因为此功能将用于各种图像并且不需要用户输入。
    • 不,您根据检测到的网格确定方向(在二值化和其他处理之后),然后旋转输入图像并再次二值化。
    猜你喜欢
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多