diff --git a/modules/imgproc/src/morph.cpp b/modules/imgproc/src/morph.cpp index 982b2946fe..39f5057a13 100644 --- a/modules/imgproc/src/morph.cpp +++ b/modules/imgproc/src/morph.cpp @@ -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" ); diff --git a/modules/imgproc/test/test_filter.cpp b/modules/imgproc/test/test_filter.cpp index 6452aec232..c995feb4b2 100644 --- a/modules/imgproc/test/test_filter.cpp +++ b/modules/imgproc/test/test_filter.cpp @@ -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_ src(3, 3); + src << 0, 255, 0, + 0, 0, 0, + 0, 255, 0; + + Mat_ kernel = src / 255; + + Mat dst; + morphologyEx(src, dst, MORPH_HITMISS, kernel); + + Mat ref = Mat::zeros(3, 3, CV_8U); + ref.at(1, 1) = 255; + + ASSERT_DOUBLE_EQ(norm(dst, ref, NORM_INF), 0.); +} + +TEST(Imgproc_MorphEx, hitmiss_zero_kernel) +{ + Mat_ src(3, 3); + src << 0, 255, 0, + 0, 0, 0, + 0, 255, 0; + + Mat_ kernel = Mat_::zeros(3, 3); + + Mat dst; + morphologyEx(src, dst, MORPH_HITMISS, kernel); + + ASSERT_DOUBLE_EQ(norm(dst, src, NORM_INF), 0.); +}