【2】MATLAB中strel('disk',r)的C实现

strel 是MATLAB中常用的类型,即是structuring element,用来构建结构元素。opencv中与其相似的函数是getStructuringElement()这个函数。 


这里仅仅说是相似主要是因为两者还是有很多区别的。

getStructuringElement()可以获取常用的结构元素的形状:矩形(MORPH_RECT)、椭圆(MORPH_ELLIPSE)及十字形(MORPH_CROSS)。

strel 能构建的结构元素更多,但与getStructuringElement()对应的且能直接实现也就只有‘square’/'rectangle'矩形了吧!

列如:

strel('square', 3)

就可以由

Mat ele = getStructuringElement(MORPH_RECT, Size(3, 3));
来实现。


理论上getStructuringElement()在Size(n,n)时构造的应该是个圆,事实上并不是,它依然是个椭圆。所以,getStructuringElement()可能并不能根据需要随时构造出圆形结构元素。

为了方便调试,我们可能需要通过改变半径轻松的得到圆形结构元素。算是皇天不负有心人吧奋斗最终得出了通式,具体怎么推出来就不解释了,下面是构造任意半径圆形结构的C代码。


//matlab strel('disk',Radius)
Mat strelDisk(int Radius)
{
	int borderWidth; Mat sel; int m, n;
	switch (Radius){
	case 1: 
	case 2: 
		if (Radius == 1) 
			borderWidth = 1;
		else
			borderWidth = 2;
		sel=Mat((2 * Radius + 1), (2 * Radius + 1), CV_8U, cv::Scalar(1));
		break;//当半径为1时是3X3的 ,当半径为2时是5X5的
	case 3:
		borderWidth = 0;
		sel=Mat((2 * Radius - 1), (2 * Radius - 1), CV_8U, cv::Scalar(1)); 
		break;
	default:
		n = Radius / 7; m = Radius % 7;
		if (m == 0 || m >= 4)
			borderWidth = 2 * (2 * n + 1);
		else
			borderWidth = 2 * 2 * n;
		sel=Mat((2 * Radius - 1), (2 * Radius - 1), CV_8U, cv::Scalar(1));
		break;	
	}
	for (int i = 0; i < borderWidth; i++){
		for (int j = 0; j < borderWidth; j++){
			if (i + j < borderWidth){
				sel.at<uchar>(i, j) = 0;
				sel.at<uchar>(i, sel.cols - 1 - j) = 0;
				sel.at<uchar>(sel.rows - 1 - i, j) = 0;
				sel.at<uchar>(sel.rows - 1 - i, sel.cols - 1 - j) = 0;
			}
		}
	}
	return sel;
}















猜你喜欢

转载自blog.csdn.net/A_Jia_17/article/details/65938691