[opencv] 12/251: imgproc: fix MORPH_HITMISS operation when kernel has no negative values

Nobuhiro Iwamatsu iwamatsu at moszumanska.debian.org
Sun Aug 27 23:27:18 UTC 2017


This is an automated email from the git hooks/post-receive script.

iwamatsu pushed a commit to annotated tag 3.3.0
in repository opencv.

commit 42936d3227cfb406daf5e85c9d7da37c07b3af65
Author: Vladislav Sovrasov <sovrasov.vlad at gmail.com>
Date:   Fri Jun 30 14:25:05 2017 +0300

    imgproc: fix MORPH_HITMISS operation when kernel has no negative values
---
 modules/imgproc/src/morph.cpp        | 32 +++++++++++++++++++-------------
 modules/imgproc/test/test_filter.cpp | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+), 13 deletions(-)

diff --git a/modules/imgproc/src/morph.cpp b/modules/imgproc/src/morph.cpp
index 982b294..39f5057 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 6452aec..c995feb 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_<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.);
+}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/opencv.git



More information about the debian-science-commits mailing list