BORDER_ISOLATED support for Laplacian, boxFilter and morphology;

pull/7554/head
Pavel Vlasov 8 years ago
parent dc9602ee84
commit f07525031b
  1. 12
      modules/imgproc/src/deriv.cpp
  2. 12
      modules/imgproc/src/morph.cpp
  3. 9
      modules/imgproc/src/smooth.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<FilterEngine> fx = createSeparableLinearFilter(stype,
wtype, kd, ks, Point(-1,-1), 0, borderType, borderType, Scalar() );
Ptr<FilterEngine> 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;

@ -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<hal::Morph> 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);

@ -1717,11 +1717,14 @@ void cv::boxFilter( InputArray _src, OutputArray _dst, int ddepth,
ipp_boxfilter( _src, _dst, ddepth, ksize, anchor, normalize, borderType));
#endif
Ptr<FilterEngine> 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<FilterEngine> f = createBoxFilter( src.type(), dst.type(),
ksize, anchor, normalize, borderType );
f->apply( src, dst, wsz, ofs );
}

Loading…
Cancel
Save