From aba73af7fbdb50e15d35a30c632255351cc07b06 Mon Sep 17 00:00:00 2001 From: Vladislav Sovrasov Date: Fri, 31 Mar 2017 13:14:40 +0300 Subject: [PATCH] ximgproc: fix weightedMedianFilter crash on zero mask --- modules/ximgproc/src/weighted_median_filter.cpp | 11 ++++++++--- modules/ximgproc/test/test_weighted_median_filter.cpp | 10 ++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/modules/ximgproc/src/weighted_median_filter.cpp b/modules/ximgproc/src/weighted_median_filter.cpp index 92db2e453..d438fb962 100644 --- a/modules/ximgproc/src/weighted_median_filter.cpp +++ b/modules/ximgproc/src/weighted_median_filter.cpp @@ -493,7 +493,7 @@ Mat filterCore(Mat &I, Mat &F, float **wMap, int r=20, int nF=256, int nI=256, M // Move cut-point to the left if(balanceWeight >= 0) { - for(;balanceWeight >= 0 && curMedianVal; curMedianVal--) + for(;balanceWeight >= 0 && curMedianVal > 0; curMedianVal--) { float curWeight = 0; int *nextHist = H[curMedianVal]; @@ -539,8 +539,13 @@ Mat filterCore(Mat &I, Mat &F, float **wMap, int r=20, int nF=256, int nI=256, M } // Weighted median is found and written to the output image - if(balanceWeight<0)outImg.ptr(y,x)[0] = curMedianVal+1; - else outImg.ptr(y,x)[0] = curMedianVal; + if(curMedianVal != -1) + { + if(balanceWeight < 0) + outImg.ptr(y,x)[0] = curMedianVal+1; + else + outImg.ptr(y,x)[0] = curMedianVal; + } // Update joint-histogram and BCB when local window is shifted. int fval,gval,*curHist; diff --git a/modules/ximgproc/test/test_weighted_median_filter.cpp b/modules/ximgproc/test/test_weighted_median_filter.cpp index 9dea51fd1..69a653047 100644 --- a/modules/ximgproc/test/test_weighted_median_filter.cpp +++ b/modules/ximgproc/test/test_weighted_median_filter.cpp @@ -102,6 +102,16 @@ TEST(WeightedMedianFilterTest, ReferenceAccuracy) EXPECT_LE(cvtest::norm(res, ref, NORM_L2), totalMaxError); } +TEST(WeightedMedianFilterTest, mask_zeros_no_crash) +{ + Mat img = imread(getDataDir() + "cv/ximgproc/sources/01.png"); + Mat mask = Mat::zeros(img.size(), CV_8U); + Mat filtered; + weightedMedianFilter(img, img, filtered, 3, 20, WMF_EXP, mask); + + EXPECT_EQ(cv::norm(img, filtered, NORM_INF), 0.0); +} + INSTANTIATE_TEST_CASE_P(TypicalSET, WeightedMedianFilterTest, Combine(Values(szODD, szQVGA), Values(WMF_EXP, WMF_IV2, WMF_OFF))); }