From f07525031b3069aae7a35fb4e045b25acbf38000 Mon Sep 17 00:00:00 2001 From: Pavel Vlasov Date: Wed, 26 Oct 2016 14:07:41 +0300 Subject: [PATCH] BORDER_ISOLATED support for Laplacian, boxFilter and morphology; --- modules/imgproc/src/deriv.cpp | 12 +++++++----- modules/imgproc/src/morph.cpp | 12 +++++++++--- modules/imgproc/src/smooth.cpp | 9 ++++++--- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/modules/imgproc/src/deriv.cpp b/modules/imgproc/src/deriv.cpp index 77ba341309..d7d3e9560d 100644 --- a/modules/imgproc/src/deriv.cpp +++ b/modules/imgproc/src/deriv.cpp @@ -864,17 +864,19 @@ void cv::Laplacian( InputArray _src, OutputArray _dst, int ddepth, int ksize, ocl_Laplacian5(_src, _dst, kd, ks, scale, delta, borderType, wdepth, ddepth)) + Mat src = _src.getMat(), dst = _dst.getMat(); + Point ofs; + Size wsz(src.cols, src.rows); + if(!(borderType&BORDER_ISOLATED)) + src.locateROI( wsz, ofs ); + borderType = (borderType&~BORDER_ISOLATED); + const size_t STRIPE_SIZE = 1 << 14; Ptr fx = createSeparableLinearFilter(stype, wtype, kd, ks, Point(-1,-1), 0, borderType, borderType, Scalar() ); Ptr fy = createSeparableLinearFilter(stype, wtype, ks, kd, Point(-1,-1), 0, borderType, borderType, Scalar() ); - Mat src = _src.getMat(), dst = _dst.getMat(); - Point ofs; - Size wsz(src.cols, src.rows); - src.locateROI( wsz, ofs ); - int y = fx->start(src, wsz, ofs), dsty = 0, dy = 0; fy->start(src, wsz, ofs); const uchar* sptr = src.ptr() + src.step[0] * y; diff --git a/modules/imgproc/src/morph.cpp b/modules/imgproc/src/morph.cpp index a0103b3143..674ebe3ffa 100644 --- a/modules/imgproc/src/morph.cpp +++ b/modules/imgproc/src/morph.cpp @@ -1855,15 +1855,21 @@ static void morphOp( int op, InputArray _src, OutputArray _dst, Point s_ofs; Size s_wsz(src.cols, src.rows); - src.locateROI(s_wsz, s_ofs); Point d_ofs; Size d_wsz(dst.cols, dst.rows); - dst.locateROI(d_wsz, d_ofs); + bool isolated = (borderType&BORDER_ISOLATED)?true:false; + borderType = (borderType&~BORDER_ISOLATED); + + if(!isolated) + { + src.locateROI(s_wsz, s_ofs); + dst.locateROI(d_wsz, d_ofs); + } Ptr ctx = hal::Morph::create(op, src.type(), dst.type(), src.cols, src.rows, kernel.type(), kernel.data, kernel.step, kernel.cols, kernel.rows, anchor.x, anchor.y, borderType, borderValue.val, iterations, - src.isSubmatrix(), src.data == dst.data); + (src.isSubmatrix() && !isolated), src.data == dst.data); ctx->apply(src.data, src.step, dst.data, dst.step, src.cols, src.rows, s_wsz.width, s_wsz.height, s_ofs.x, s_ofs.y, d_wsz.width, d_wsz.height, d_ofs.x, d_ofs.y); diff --git a/modules/imgproc/src/smooth.cpp b/modules/imgproc/src/smooth.cpp index f0d6bfbfca..ca5488ce4d 100644 --- a/modules/imgproc/src/smooth.cpp +++ b/modules/imgproc/src/smooth.cpp @@ -1717,11 +1717,14 @@ void cv::boxFilter( InputArray _src, OutputArray _dst, int ddepth, ipp_boxfilter( _src, _dst, ddepth, ksize, anchor, normalize, borderType)); #endif - Ptr f = createBoxFilter( src.type(), dst.type(), - ksize, anchor, normalize, borderType ); Point ofs; Size wsz(src.cols, src.rows); - src.locateROI( wsz, ofs ); + if(!(borderType&BORDER_ISOLATED)) + src.locateROI( wsz, ofs ); + borderType = (borderType&~BORDER_ISOLATED); + + Ptr f = createBoxFilter( src.type(), dst.type(), + ksize, anchor, normalize, borderType ); f->apply( src, dst, wsz, ofs ); }