From 33f77774c50d7f229618c6014ec7c0632b9d013f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorena=20Garc=C3=ADa?= Date: Wed, 14 Oct 2015 13:30:09 +0200 Subject: [PATCH 1/3] Hit&Miss morphological operation --- modules/imgproc/include/opencv2/imgproc.hpp | 4 +++- modules/imgproc/src/morph.cpp | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/modules/imgproc/include/opencv2/imgproc.hpp b/modules/imgproc/include/opencv2/imgproc.hpp index d8ded742c1..2eecb9af23 100644 --- a/modules/imgproc/include/opencv2/imgproc.hpp +++ b/modules/imgproc/include/opencv2/imgproc.hpp @@ -225,8 +225,10 @@ enum MorphTypes{ //!< \f[\texttt{dst} = \mathrm{morph\_grad} ( \texttt{src} , \texttt{element} )= \mathrm{dilate} ( \texttt{src} , \texttt{element} )- \mathrm{erode} ( \texttt{src} , \texttt{element} )\f] MORPH_TOPHAT = 5, //!< "top hat" //!< \f[\texttt{dst} = \mathrm{tophat} ( \texttt{src} , \texttt{element} )= \texttt{src} - \mathrm{open} ( \texttt{src} , \texttt{element} )\f] - MORPH_BLACKHAT = 6 //!< "black hat" + MORPH_BLACKHAT = 6, //!< "black hat" //!< \f[\texttt{dst} = \mathrm{blackhat} ( \texttt{src} , \texttt{element} )= \mathrm{close} ( \texttt{src} , \texttt{element} )- \texttt{src}\f] + MORPH_HITMISS = 7 //!< "hit and miss" + //!< .- Only supported for CV_8UC1 binary images. Tutorial can be found in [this page](http://opencv-code.com/tutorials/hit-or-miss-transform-in-opencv/) }; //! shape of the structuring element diff --git a/modules/imgproc/src/morph.cpp b/modules/imgproc/src/morph.cpp index 1ec1d25bf6..0b2b613af1 100644 --- a/modules/imgproc/src/morph.cpp +++ b/modules/imgproc/src/morph.cpp @@ -1870,6 +1870,8 @@ void cv::morphologyEx( InputArray _src, OutputArray _dst, int op, _dst.create(src.size(), src.type()); Mat dst = _dst.getMat(); + Mat k1, k2, e1, e2; //only for hit and miss op + switch( op ) { case MORPH_ERODE: @@ -1905,6 +1907,22 @@ void cv::morphologyEx( InputArray _src, OutputArray _dst, int op, erode( temp, temp, kernel, anchor, iterations, borderType, borderValue ); dst = temp - src; break; + case MORPH_HITMISS: + CV_Assert(src.type() == CV_8U && src.channels() == 1); + k1 = (kernel == 1) / 255; + k2 = (kernel == -1) / 255; + normalize(src, src, 0, 1, NORM_MINMAX); + if (countNonZero(k1) <= 0) + e1 = src; + else + erode(src, e1, k1, anchor, iterations, borderType, borderValue); + if (countNonZero(k2) <= 0) + e2 = src; + else + erode(1 - src, e2, k2, anchor, iterations, borderType, borderValue); + dst = e1 & e2; + normalize(dst, dst, 0, 255, NORM_MINMAX); + break; default: CV_Error( CV_StsBadArg, "unknown morphological operation" ); } From fb03330ea3e80154ee1cf5e0bbd83e55ad49b233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorena=20Garc=C3=ADa?= Date: Sat, 24 Oct 2015 00:22:50 +0200 Subject: [PATCH 2/3] Fixed CV_Assert --- modules/imgproc/src/morph.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/imgproc/src/morph.cpp b/modules/imgproc/src/morph.cpp index 0b2b613af1..ee4f8c4040 100644 --- a/modules/imgproc/src/morph.cpp +++ b/modules/imgproc/src/morph.cpp @@ -1908,10 +1908,10 @@ void cv::morphologyEx( InputArray _src, OutputArray _dst, int op, dst = temp - src; break; case MORPH_HITMISS: - CV_Assert(src.type() == CV_8U && src.channels() == 1); k1 = (kernel == 1) / 255; k2 = (kernel == -1) / 255; normalize(src, src, 0, 1, NORM_MINMAX); + CV_Assert(src.type() == CV_8UC1); if (countNonZero(k1) <= 0) e1 = src; else From 7cff60f4f62ee9f8b8889bc0e5dd6b59fe30fc4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorena=20Garc=C3=ADa?= Date: Sat, 24 Oct 2015 00:33:36 +0200 Subject: [PATCH 3/3] Changed src matrix complement computation --- modules/imgproc/src/morph.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/modules/imgproc/src/morph.cpp b/modules/imgproc/src/morph.cpp index ee4f8c4040..4731b727c5 100644 --- a/modules/imgproc/src/morph.cpp +++ b/modules/imgproc/src/morph.cpp @@ -1908,10 +1908,9 @@ void cv::morphologyEx( InputArray _src, OutputArray _dst, int op, dst = temp - src; break; case MORPH_HITMISS: - k1 = (kernel == 1) / 255; - k2 = (kernel == -1) / 255; - normalize(src, src, 0, 1, NORM_MINMAX); CV_Assert(src.type() == CV_8UC1); + k1 = (kernel == 1); + k2 = (kernel == -1); if (countNonZero(k1) <= 0) e1 = src; else @@ -1919,9 +1918,12 @@ void cv::morphologyEx( InputArray _src, OutputArray _dst, int op, if (countNonZero(k2) <= 0) e2 = src; else - erode(1 - src, e2, k2, anchor, iterations, borderType, borderValue); + { + Mat src_complement; + bitwise_not(src, src_complement); + erode(src_complement, e2, k2, anchor, iterations, borderType, borderValue); + } dst = e1 & e2; - normalize(dst, dst, 0, 255, NORM_MINMAX); break; default: CV_Error( CV_StsBadArg, "unknown morphological operation" );