mirror of
https://github.com/opencv/opencv.git
synced 2025-08-06 14:36:36 +08:00
imgproc: fix MORPH_HITMISS operation when kernel has no negative values
This commit is contained in:
parent
7b8e6307f8
commit
42936d3227
@ -2012,8 +2012,6 @@ void cv::morphologyEx( InputArray _src, OutputArray _dst, int op,
|
||||
CV_IPP_RUN_FAST(ipp_morphologyEx(op, src, dst, kernel, anchor, iterations, borderType, borderValue));
|
||||
#endif
|
||||
|
||||
Mat k1, k2, e1, e2; //only for hit and miss op
|
||||
|
||||
switch( op )
|
||||
{
|
||||
case MORPH_ERODE:
|
||||
@ -2051,21 +2049,29 @@ void cv::morphologyEx( InputArray _src, OutputArray _dst, int op,
|
||||
break;
|
||||
case MORPH_HITMISS:
|
||||
CV_Assert(src.type() == CV_8UC1);
|
||||
k1 = (kernel == 1);
|
||||
k2 = (kernel == -1);
|
||||
if (countNonZero(k1) <= 0)
|
||||
e1 = src;
|
||||
else
|
||||
erode(src, e1, k1, anchor, iterations, borderType, borderValue);
|
||||
if (countNonZero(k2) <= 0)
|
||||
e2 = src;
|
||||
else
|
||||
if(countNonZero(kernel) <=0)
|
||||
{
|
||||
src.copyTo(dst);
|
||||
break;
|
||||
}
|
||||
{
|
||||
Mat k1, k2, e1, e2;
|
||||
k1 = (kernel == 1);
|
||||
k2 = (kernel == -1);
|
||||
|
||||
if (countNonZero(k1) <= 0)
|
||||
e1 = src;
|
||||
else
|
||||
erode(src, e1, k1, anchor, iterations, borderType, borderValue);
|
||||
|
||||
Mat src_complement;
|
||||
bitwise_not(src, src_complement);
|
||||
erode(src_complement, e2, k2, anchor, iterations, borderType, borderValue);
|
||||
if (countNonZero(k2) <= 0)
|
||||
e2 = src_complement;
|
||||
else
|
||||
erode(src_complement, e2, k2, anchor, iterations, borderType, borderValue);
|
||||
dst = e1 & e2;
|
||||
}
|
||||
dst = e1 & e2;
|
||||
break;
|
||||
default:
|
||||
CV_Error( CV_StsBadArg, "unknown morphological operation" );
|
||||
|
@ -2065,3 +2065,36 @@ TEST(Imgproc_Sobel, borderTypes)
|
||||
EXPECT_EQ(expected_dst.size(), dst.size());
|
||||
EXPECT_DOUBLE_EQ(0.0, cvtest::norm(expected_dst, dst, NORM_INF));
|
||||
}
|
||||
|
||||
TEST(Imgproc_MorphEx, hitmiss_regression_8957)
|
||||
{
|
||||
Mat_<uchar> src(3, 3);
|
||||
src << 0, 255, 0,
|
||||
0, 0, 0,
|
||||
0, 255, 0;
|
||||
|
||||
Mat_<uchar> kernel = src / 255;
|
||||
|
||||
Mat dst;
|
||||
morphologyEx(src, dst, MORPH_HITMISS, kernel);
|
||||
|
||||
Mat ref = Mat::zeros(3, 3, CV_8U);
|
||||
ref.at<uchar>(1, 1) = 255;
|
||||
|
||||
ASSERT_DOUBLE_EQ(norm(dst, ref, NORM_INF), 0.);
|
||||
}
|
||||
|
||||
TEST(Imgproc_MorphEx, hitmiss_zero_kernel)
|
||||
{
|
||||
Mat_<uchar> src(3, 3);
|
||||
src << 0, 255, 0,
|
||||
0, 0, 0,
|
||||
0, 255, 0;
|
||||
|
||||
Mat_<uchar> kernel = Mat_<uchar>::zeros(3, 3);
|
||||
|
||||
Mat dst;
|
||||
morphologyEx(src, dst, MORPH_HITMISS, kernel);
|
||||
|
||||
ASSERT_DOUBLE_EQ(norm(dst, src, NORM_INF), 0.);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user