首页 文章

实现椭圆结构元素

提问于
浏览
0

我想使用 OpenCV 实现以下内容(我将在帖子的底部发布我的尝试) . 我知道OpenCV有这样的功能,但我想尝试自己编写 .

在宽度为 width 且高度为 height 的图像(Mat)(坐标系位于左上角,因为它是图像)中,我想显示具有以下属性的 filled 椭圆:

  • 它应该以 (width/2, height/2) 为中心

  • 图像应该是二进制的,因此对应椭圆的点的值应为1,其他点应为0

  • 椭圆应该围绕原点旋转 angle 弧度(或度,这并不重要,我可以转换)

  • ellipse:半长轴参数是 a ,半短轴参数是 b ,这两个参数也表示图片中这些轴的大小,所以 width widthheight ,椭圆应该有一个长轴 2*a 和一个短轴 2*b

好的,所以为了我的目的,我找到了一个与此相似的方程式(https://math.stackexchange.com/a/434482/403961) . 我的代码如下......它似乎在旋转方面做得很好,但遗憾的是,根据旋转角度,SIZE(长轴,不确定次要)明显增加/减少,这是不正常的因为我希望它具有相同的尺寸,与旋转角度无关 .

NOTE 当角度为45°或-45°时,最大尺寸似乎达到,而对于-90°,0°,90°等角度,最小尺寸 .

码:

inline double sqr(double x)
{
    return x * x;
}

Mat ellipticalElement(double a, double b, double angle, int width, int height)
{
    // just to make sure I don't use some bad values for my parameters
    assert(2 * a < width);
    assert(2 * b < height);

    Mat element = Mat::zeros(height, width, CV_8UC1);

    Point center(width / 2, height / 2);
    for(int x = 0 ; x < width ; x++)
        for(int y = 0 ; y < height ; y++)
        {
            if (sqr((x - center.x) * cos(angle) - (y - center.y) * sin(angle)) / sqr(a) + sqr((x - center.x) * sin(angle) - (y - center.y) * cos(angle)) / sqr(b) <= 1)
                element.at<uchar>(y, x) = 1;
        }

    return element;
}

1 回答

  • 1

    一个讨厌的拼写错误潜入你的不平等 . 第一个加数必须是

    sqr((x - center.x) * cos(angle) + (y - center.y) * sin(angle)) / sqr(a)
    

    注意 plus 符号而不是 minus .

相关问题