实现椭圆结构元素
Implement an Ellipse Structural Element
我想使用 OpenCV 实现以下内容(我将 post 我的尝试放在 post 的底部)。我知道 OpenCV 有类似这样的功能,但我想尝试编写自己的功能。
在宽度width
和高度height
的图像(Mat)(坐标系在左上角,因为它是图像)中,我想显示一个填充椭圆具有以下属性:
它应该以 (width/2, height/2)
为中心
图像应该是二值的,所以椭圆对应的点的值应该是1,其他的应该是0
椭圆应该围绕原点旋转angle
弧度(或度数,这无关紧要,我可以转换)
ellipse:半长轴参数为a
,半短轴参数为b
,这两个参数也代表图中这些轴的大小,所以 "no matter" width
和 height
,椭圆应该有一个长轴 2*a
和一个短轴 2*b
好的,所以我找到了一个与此类似的方程式 (https://math.stackexchange.com/a/434482/403961) 以供我使用。我的代码如下..它似乎在旋转方面做得很好,但遗憾的是,根据旋转角度,SIZE(长轴,不确定次轴)明显 increases/decreases,这是不正常,因为我希望它具有相同的大小,与旋转角度无关。
注意 当角度为 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;
}
一个讨厌的拼写错误潜入了你的不平等。第一个被加数必须是
sqr((x - center.x) * cos(angle) + (y - center.y) * sin(angle)) / sqr(a)
注意 加号 而不是 减号。
我想使用 OpenCV 实现以下内容(我将 post 我的尝试放在 post 的底部)。我知道 OpenCV 有类似这样的功能,但我想尝试编写自己的功能。
在宽度width
和高度height
的图像(Mat)(坐标系在左上角,因为它是图像)中,我想显示一个填充椭圆具有以下属性:
它应该以
(width/2, height/2)
为中心
图像应该是二值的,所以椭圆对应的点的值应该是1,其他的应该是0
椭圆应该围绕原点旋转
angle
弧度(或度数,这无关紧要,我可以转换)ellipse:半长轴参数为
a
,半短轴参数为b
,这两个参数也代表图中这些轴的大小,所以 "no matter"width
和height
,椭圆应该有一个长轴2*a
和一个短轴2*b
好的,所以我找到了一个与此类似的方程式 (https://math.stackexchange.com/a/434482/403961) 以供我使用。我的代码如下..它似乎在旋转方面做得很好,但遗憾的是,根据旋转角度,SIZE(长轴,不确定次轴)明显 increases/decreases,这是不正常,因为我希望它具有相同的大小,与旋转角度无关。
注意 当角度为 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;
}
一个讨厌的拼写错误潜入了你的不平等。第一个被加数必须是
sqr((x - center.x) * cos(angle) + (y - center.y) * sin(angle)) / sqr(a)
注意 加号 而不是 减号。