[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