在图像处理中,经常要用到形态学操作,形态学操作中的结构元素有很多,如点结构 十字架结构 圆结构 矩形结构 椭圆形结构等等
本文将介绍椭圆形结构的实现。(主要结合OpenCV实现)
具体如下:
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Size ksize = Size(7, 7);
int i, j;
int r = 0, c = 0;
double inv_r2 = 0;
r = ksize.height/2;
c = ksize.width/2;
inv_r2 = r ? 1./((double)r*r) : 0;
Mat elem(ksize, CV_8U);
for( i = 0; i < ksize.height; i++ )
{
uchar* ptr = elem.ptr(i);
int j1 = 0, j2 = 0;
int dy = i - r;
if( std::abs(dy) <= r )
{
int dx = saturate_cast<int>(c*std::sqrt((r*r - dy*dy)*inv_r2));
j1 = std::max( c - dx, 0 );
j2 = std::min( c + dx + 1, ksize.width );
}
for( j = 0; j < j1; j++ )
ptr[j] = 0;
for( ; j < j2; j++ )
ptr[j] = 1;
for( ; j < ksize.width; j++ )
ptr[j] = 0;
}
cout<< elem<<endl;
waitKey(0);
system("pause");
return 0;
}
运行结果如下: