Merge pull request #3102 from akarsakov:ocl_denoising_fix
This commit is contained in:
commit
0e46b4cd03
@ -48,11 +48,13 @@
|
|||||||
void cv::fastNlMeansDenoising( InputArray _src, OutputArray _dst, float h,
|
void cv::fastNlMeansDenoising( InputArray _src, OutputArray _dst, float h,
|
||||||
int templateWindowSize, int searchWindowSize)
|
int templateWindowSize, int searchWindowSize)
|
||||||
{
|
{
|
||||||
CV_OCL_RUN(_src.dims() <= 2 && (_src.isUMat() || _dst.isUMat()),
|
Size src_size = _src.size();
|
||||||
|
CV_OCL_RUN(_src.dims() <= 2 && (_src.isUMat() || _dst.isUMat()) &&
|
||||||
|
src_size.width > 5 && src_size.height > 5, // low accuracy on small sizes
|
||||||
ocl_fastNlMeansDenoising(_src, _dst, h, templateWindowSize, searchWindowSize))
|
ocl_fastNlMeansDenoising(_src, _dst, h, templateWindowSize, searchWindowSize))
|
||||||
|
|
||||||
Mat src = _src.getMat();
|
Mat src = _src.getMat();
|
||||||
_dst.create(src.size(), src.type());
|
_dst.create(src_size, src.type());
|
||||||
Mat dst = _dst.getMat();
|
Mat dst = _dst.getMat();
|
||||||
|
|
||||||
#ifdef HAVE_TEGRA_OPTIMIZATION
|
#ifdef HAVE_TEGRA_OPTIMIZATION
|
||||||
@ -87,26 +89,27 @@ void cv::fastNlMeansDenoisingColored( InputArray _src, OutputArray _dst,
|
|||||||
int templateWindowSize, int searchWindowSize)
|
int templateWindowSize, int searchWindowSize)
|
||||||
{
|
{
|
||||||
int type = _src.type(), depth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type);
|
int type = _src.type(), depth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type);
|
||||||
|
Size src_size = _src.size();
|
||||||
if (type != CV_8UC3 && type != CV_8UC4)
|
if (type != CV_8UC3 && type != CV_8UC4)
|
||||||
{
|
{
|
||||||
CV_Error(Error::StsBadArg, "Type of input image should be CV_8UC3!");
|
CV_Error(Error::StsBadArg, "Type of input image should be CV_8UC3!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CV_OCL_RUN(_src.dims() <= 2 && (_dst.isUMat() || _src.isUMat()),
|
CV_OCL_RUN(_src.dims() <= 2 && (_dst.isUMat() || _src.isUMat()) &&
|
||||||
|
src_size.width > 5 && src_size.height > 5, // low accuracy on small sizes
|
||||||
ocl_fastNlMeansDenoisingColored(_src, _dst, h, hForColorComponents,
|
ocl_fastNlMeansDenoisingColored(_src, _dst, h, hForColorComponents,
|
||||||
templateWindowSize, searchWindowSize))
|
templateWindowSize, searchWindowSize))
|
||||||
|
|
||||||
Mat src = _src.getMat();
|
Mat src = _src.getMat();
|
||||||
_dst.create(src.size(), type);
|
_dst.create(src_size, type);
|
||||||
Mat dst = _dst.getMat();
|
Mat dst = _dst.getMat();
|
||||||
|
|
||||||
Mat src_lab;
|
Mat src_lab;
|
||||||
cvtColor(src, src_lab, COLOR_LBGR2Lab);
|
cvtColor(src, src_lab, COLOR_LBGR2Lab);
|
||||||
|
|
||||||
Mat l(src.size(), CV_8U);
|
Mat l(src_size, CV_8U);
|
||||||
Mat ab(src.size(), CV_8UC2);
|
Mat ab(src_size, CV_8UC2);
|
||||||
Mat l_ab[] = { l, ab };
|
Mat l_ab[] = { l, ab };
|
||||||
int from_to[] = { 0,0, 1,1, 2,2 };
|
int from_to[] = { 0,0, 1,1, 2,2 };
|
||||||
mixChannels(&src_lab, 1, l_ab, 2, from_to, 3);
|
mixChannels(&src_lab, 1, l_ab, 2, from_to, 3);
|
||||||
@ -115,7 +118,7 @@ void cv::fastNlMeansDenoisingColored( InputArray _src, OutputArray _dst,
|
|||||||
fastNlMeansDenoising(ab, ab, hForColorComponents, templateWindowSize, searchWindowSize);
|
fastNlMeansDenoising(ab, ab, hForColorComponents, templateWindowSize, searchWindowSize);
|
||||||
|
|
||||||
Mat l_ab_denoised[] = { l, ab };
|
Mat l_ab_denoised[] = { l, ab };
|
||||||
Mat dst_lab(src.size(), CV_MAKE_TYPE(depth, 3));
|
Mat dst_lab(src_size, CV_MAKE_TYPE(depth, 3));
|
||||||
mixChannels(l_ab_denoised, 2, &dst_lab, 1, from_to, 3);
|
mixChannels(l_ab_denoised, 2, &dst_lab, 1, from_to, 3);
|
||||||
|
|
||||||
cvtColor(dst_lab, dst, COLOR_Lab2LBGR, cn);
|
cvtColor(dst_lab, dst, COLOR_Lab2LBGR, cn);
|
||||||
|
Loading…
Reference in New Issue
Block a user