mirror of
https://github.com/opencv/opencv_contrib.git
synced 2025-10-19 19:44:14 +08:00
removed the filterSpecleImpl
This commit is contained in:
@@ -954,102 +954,5 @@ namespace cv
|
|||||||
}
|
}
|
||||||
|
|
||||||
typedef cv::Point_<short> Point2s;
|
typedef cv::Point_<short> Point2s;
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void filterSpecklesImpl(cv::Mat& img, int newVal, int maxSpeckleSize, int maxDiff, cv::Mat& _buf)
|
|
||||||
{
|
|
||||||
using namespace cv;
|
|
||||||
|
|
||||||
int width = img.cols, height = img.rows, npixels = width*height;
|
|
||||||
size_t bufSize = npixels*(int)(sizeof(Point2s) + sizeof(int) + sizeof(uchar));
|
|
||||||
if( !_buf.isContinuous() || _buf.empty() || _buf.cols*_buf.rows*_buf.elemSize() < bufSize )
|
|
||||||
_buf.create(1, (int)bufSize, CV_8U);
|
|
||||||
|
|
||||||
uchar* buf = _buf.ptr();
|
|
||||||
int i, j, dstep = (int)(img.step/sizeof(T));
|
|
||||||
int* labels = (int*)buf;
|
|
||||||
buf += npixels*sizeof(labels[0]);
|
|
||||||
Point2s* wbuf = (Point2s*)buf;
|
|
||||||
buf += npixels*sizeof(wbuf[0]);
|
|
||||||
uchar* rtype = (uchar*)buf;
|
|
||||||
int curlabel = 0;
|
|
||||||
|
|
||||||
// clear out label assignments
|
|
||||||
memset(labels, 0, npixels*sizeof(labels[0]));
|
|
||||||
|
|
||||||
for( i = 0; i < height; i++ )
|
|
||||||
{
|
|
||||||
T* ds = img.ptr<T>(i);
|
|
||||||
int* ls = labels + width*i;
|
|
||||||
|
|
||||||
for( j = 0; j < width; j++ )
|
|
||||||
{
|
|
||||||
if( ds[j] != newVal ) // not a bad disparity
|
|
||||||
{
|
|
||||||
if( ls[j] ) // has a label, check for bad label
|
|
||||||
{
|
|
||||||
if( rtype[ls[j]] ) // small region, zero out disparity
|
|
||||||
ds[j] = (T)newVal;
|
|
||||||
}
|
|
||||||
// no label, assign and propagate
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Point2s* ws = wbuf; // initialize wavefront
|
|
||||||
Point2s p((short)j, (short)i); // current pixel
|
|
||||||
curlabel++; // next label
|
|
||||||
int count = 0; // current region size
|
|
||||||
ls[j] = curlabel;
|
|
||||||
|
|
||||||
// wavefront propagation
|
|
||||||
while( ws >= wbuf ) // wavefront not empty
|
|
||||||
{
|
|
||||||
count++;
|
|
||||||
// put neighbors onto wavefront
|
|
||||||
T* dpp = &img.at<T>(p.y, p.x);
|
|
||||||
T dp = *dpp;
|
|
||||||
int* lpp = labels + width*p.y + p.x;
|
|
||||||
|
|
||||||
if( p.y < height-1 && !lpp[+width] && dpp[+dstep] != newVal && std::abs(dp - dpp[+dstep]) <= maxDiff )
|
|
||||||
{
|
|
||||||
lpp[+width] = curlabel;
|
|
||||||
*ws++ = Point2s(p.x, p.y+1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if( p.y > 0 && !lpp[-width] && dpp[-dstep] != newVal && std::abs(dp - dpp[-dstep]) <= maxDiff )
|
|
||||||
{
|
|
||||||
lpp[-width] = curlabel;
|
|
||||||
*ws++ = Point2s(p.x, p.y-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if( p.x < width-1 && !lpp[+1] && dpp[+1] != newVal && std::abs(dp - dpp[+1]) <= maxDiff )
|
|
||||||
{
|
|
||||||
lpp[+1] = curlabel;
|
|
||||||
*ws++ = Point2s(p.x+1, p.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
if( p.x > 0 && !lpp[-1] && dpp[-1] != newVal && std::abs(dp - dpp[-1]) <= maxDiff )
|
|
||||||
{
|
|
||||||
lpp[-1] = curlabel;
|
|
||||||
*ws++ = Point2s(p.x-1, p.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
// pop most recent and propagate
|
|
||||||
// NB: could try least recent, maybe better convergence
|
|
||||||
p = *--ws;
|
|
||||||
}
|
|
||||||
|
|
||||||
// assign label type
|
|
||||||
if( count <= maxSpeckleSize ) // speckle region
|
|
||||||
{
|
|
||||||
rtype[ls[j]] = 1; // small region label
|
|
||||||
ds[j] = (T)newVal;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
rtype[ls[j]] = 0; // large region label
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user