getStructuringElement函數歸屬於形態學,可以建立指定大小、形狀的結構;
原型:
/** @brief Returns a structuring element of the specified size and shape for morphological operations. The function constructs and returns the structuring element that can be further passed to cv::erode, cv::dilate or cv::morphologyEx. But you can also construct an arbitrary binary mask yourself and use it as the structuring element. @param shape Element shape that could be one of cv::MorphShapes @param ksize Size of the structuring element. @param anchor Anchor position within the element. The default value \f$(-1, -1)\f$ means that the anchor is at the center. Note that only the shape of a cross-shaped element depends on the anchor position. In other cases the anchor just regulates how much the result of the morphological operation is shifted. */ CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
源碼解析:
cv::Mat cv::getStructuringElement(int shape, Size ksize, Point anchor) { int i, j; int r = 0, c = 0; double inv_r2 = 0; CV_Assert( shape == MORPH_RECT || shape == MORPH_CROSS || shape == MORPH_ELLIPSE ); //目前支持三種形狀的單元創建: 矩形, 十字形, 橢圓形; anchor = normalizeAnchor(anchor, ksize); //當默認為-1,-1時, 計算anchor; if( ksize == Size(1,1) ) //當給定大小為1,1時,表明是一個點, 可以用矩形來表示; shape = MORPH_RECT; if( shape == MORPH_ELLIPSE ) //橢圓; { 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++ ) //對每一行,計算0,1的范圍; { uchar* ptr = elem.ptr(i); int j1 = 0, j2 = 0; if( shape == MORPH_RECT || (shape == MORPH_CROSS && i == anchor.y) ) //矩形,或十字y錨點時 j2為ksize.width; j2 = ksize.width; else if( shape == MORPH_CROSS ) j1 = anchor.x, j2 = j1 + 1; else //橢圓; { int dy = i - r; if( std::abs(dy) <= r ) { int dx = saturate_cast<int>(c*std::sqrt((r*r - dy*dy)*inv_r2)); //計算得到x的偏移; j1 = std::max( c - dx, 0 ); j2 = std::min( c + dx + 1, ksize.width ); } } for( j = 0; j < j1; j++ ) //從這三個for可以看出, (0,j1)之間為 0, (j1, j2)之間為1, (j2, ksize.width)之間為0; ptr[j] = 0; for( ; j < j2; j++ ) ptr[j] = 1; for( ; j < ksize.width; j++ ) ptr[j] = 0; } return elem; }