1
0
mirror of https://github.com/opencv/opencv.git synced 2026-07-21 19:33:03 +04:00

Add diamond structuring element

This commit is contained in:
Kavyansh Tyagi
2025-06-11 15:54:29 +05:30
parent fcc76c120f
commit 452882c007
4 changed files with 36 additions and 2 deletions
+2 -1
View File
@@ -235,8 +235,9 @@ enum MorphShapes {
MORPH_RECT = 0, //!< a rectangular structuring element: \f[E_{ij}=1\f]
MORPH_CROSS = 1, //!< a cross-shaped structuring element:
//!< \f[E_{ij} = \begin{cases} 1 & \texttt{if } {i=\texttt{anchor.y } {or } {j=\texttt{anchor.x}}} \\0 & \texttt{otherwise} \end{cases}\f]
MORPH_ELLIPSE = 2 //!< an elliptic structuring element, that is, a filled ellipse inscribed
MORPH_ELLIPSE = 2, //!< an elliptic structuring element, that is, a filled ellipse inscribed
//!< into the rectangle Rect(0, 0, esize.width, esize.height)
MORPH_DIAMOND = 3 //!< a diamond structuring element defined by Manhattan distance
};
//! @} imgproc_filter
@@ -389,6 +389,7 @@ enum MorphShapes_c
CV_SHAPE_RECT =0,
CV_SHAPE_CROSS =1,
CV_SHAPE_ELLIPSE =2,
CV_SHAPE_DIAMOND =3,
CV_SHAPE_CUSTOM =100 //!< custom structuring element
};
+16 -1
View File
@@ -138,7 +138,7 @@ Mat getStructuringElement(int shape, Size ksize, Point anchor)
int r = 0, c = 0;
double inv_r2 = 0;
CV_Assert( shape == MORPH_RECT || shape == MORPH_CROSS || shape == MORPH_ELLIPSE );
CV_Assert( shape == MORPH_RECT || shape == MORPH_CROSS || shape == MORPH_ELLIPSE || shape == MORPH_DIAMOND );
anchor = normalizeAnchor(anchor, ksize);
@@ -151,6 +151,11 @@ Mat getStructuringElement(int shape, Size ksize, Point anchor)
c = ksize.width/2;
inv_r2 = r ? 1./((double)r*r) : 0;
}
else if( shape == MORPH_DIAMOND )
{
r = ksize.height/2;
c = ksize.width/2;
}
Mat elem(ksize, CV_8U);
@@ -163,6 +168,16 @@ Mat getStructuringElement(int shape, Size ksize, Point anchor)
j2 = ksize.width;
else if( shape == MORPH_CROSS )
j1 = anchor.x, j2 = j1 + 1;
else if( shape == MORPH_DIAMOND )
{
int dy = std::abs(i - r);
if( dy <= r )
{
int dx = r - dy;
j1 = std::max( c - dx, 0 );
j2 = std::min( c + dx + 1, ksize.width );
}
}
else
{
int dy = i - r;
@@ -0,0 +1,17 @@
#include "test_precomp.hpp"
namespace opencv_test { namespace {
TEST(MorphShapes, getStructuringElementDiamond)
{
cv::Mat element = cv::getStructuringElement(cv::MORPH_DIAMOND, cv::Size(5,5));
cv::Mat expected = (cv::Mat_<uchar>(5,5) <<
0,0,1,0,0,
0,1,1,1,0,
1,1,1,1,1,
0,1,1,1,0,
0,0,1,0,0);
EXPECT_EQ(0, cvtest::norm(element, expected, cv::NORM_INF));
}
}} // namespace