diff --git a/modules/imgproc/include/opencv2/imgproc.hpp b/modules/imgproc/include/opencv2/imgproc.hpp index cdc55a3c9e..06f333cd0c 100644 --- a/modules/imgproc/include/opencv2/imgproc.hpp +++ b/modules/imgproc/include/opencv2/imgproc.hpp @@ -2805,7 +2805,8 @@ The function can process the image in-place. @param src Source 8-bit single-channel image. @param dst Destination image of the same size and the same type as src. @param maxValue Non-zero value assigned to the pixels for which the condition is satisfied -@param adaptiveMethod Adaptive thresholding algorithm to use, see cv::AdaptiveThresholdTypes +@param adaptiveMethod Adaptive thresholding algorithm to use, see cv::AdaptiveThresholdTypes. +The BORDER_REPLICATE | BORDER_ISOLATED is used to process boundaries. @param thresholdType Thresholding type that must be either THRESH_BINARY or THRESH_BINARY_INV, see cv::ThresholdTypes. @param blockSize Size of a pixel neighborhood that is used to calculate a threshold value for the diff --git a/modules/imgproc/perf/perf_threshold.cpp b/modules/imgproc/perf/perf_threshold.cpp index 846f1a0290..bbe151dac9 100644 --- a/modules/imgproc/perf/perf_threshold.cpp +++ b/modules/imgproc/perf/perf_threshold.cpp @@ -60,15 +60,16 @@ PERF_TEST_P(Size_Only, threshold_otsu, testing::Values(TYPICAL_MAT_SIZES)) CV_ENUM(AdaptThreshType, THRESH_BINARY, THRESH_BINARY_INV) CV_ENUM(AdaptThreshMethod, ADAPTIVE_THRESH_MEAN_C, ADAPTIVE_THRESH_GAUSSIAN_C) -typedef std::tr1::tuple Size_AdaptThreshType_AdaptThreshMethod_BlockSize_t; -typedef perf::TestBaseWithParam Size_AdaptThreshType_AdaptThreshMethod_BlockSize; +typedef std::tr1::tuple Size_AdaptThreshType_AdaptThreshMethod_BlockSize_Delta_t; +typedef perf::TestBaseWithParam Size_AdaptThreshType_AdaptThreshMethod_BlockSize_Delta; -PERF_TEST_P(Size_AdaptThreshType_AdaptThreshMethod_BlockSize, adaptiveThreshold, +PERF_TEST_P(Size_AdaptThreshType_AdaptThreshMethod_BlockSize_Delta, adaptiveThreshold, testing::Combine( testing::Values(TYPICAL_MAT_SIZES), AdaptThreshType::all(), AdaptThreshMethod::all(), - testing::Values(3, 5) + testing::Values(3, 5), + testing::Values(0.0, 10.0) ) ) { @@ -76,12 +77,14 @@ PERF_TEST_P(Size_AdaptThreshType_AdaptThreshMethod_BlockSize, adaptiveThreshold, AdaptThreshType adaptThreshType = get<1>(GetParam()); AdaptThreshMethod adaptThreshMethod = get<2>(GetParam()); int blockSize = get<3>(GetParam()); + double C = get<4>(GetParam()); double maxValue = theRNG().uniform(1, 254); - double C = 10.0; int type = CV_8UC1; - Mat src(sz, type); + + Mat src_full(cv::Size(sz.width + 2, sz.height + 2), type); + Mat src = src_full(cv::Rect(1, 1, sz.width, sz.height)); Mat dst(sz, type); declare.in(src, WARMUP_RNG).out(dst); diff --git a/modules/imgproc/src/hal_replacement.hpp b/modules/imgproc/src/hal_replacement.hpp index f43fc70ee0..d838d68466 100644 --- a/modules/imgproc/src/hal_replacement.hpp +++ b/modules/imgproc/src/hal_replacement.hpp @@ -630,6 +630,23 @@ inline int hal_ni_medianBlur(const uchar* src_data, size_t src_step, uchar* dst_ #define cv_hal_medianBlur hal_ni_medianBlur //! @endcond +/** + @brief Calculates adaptive threshold + @param src_data,src_step Source image + @param dst_data,dst_step Destination image + @param width,height Source image dimensions + @param maxValue Value assigned to the pixels for which the condition is satisfied + @param adaptiveMethod Adaptive thresholding algorithm + @param thresholdType Thresholding type + @param blockSize Size of a pixel neighborhood that is used to calculate a threshold value + @param C Constant subtracted from the mean or weighted mean +*/ +inline int hal_ni_adaptiveThreshold(const uchar* src_data, size_t src_step, uchar* dst_data, size_t dst_step, int width, int height, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C) { return CV_HAL_ERROR_NOT_IMPLEMENTED; } + +//! @cond IGNORED +#define cv_hal_adaptiveThreshold hal_ni_adaptiveThreshold +//! @endcond + //! @} #if defined __GNUC__ diff --git a/modules/imgproc/src/thresh.cpp b/modules/imgproc/src/thresh.cpp index f7ad1955a8..a428f7c0e3 100644 --- a/modules/imgproc/src/thresh.cpp +++ b/modules/imgproc/src/thresh.cpp @@ -1530,6 +1530,9 @@ void cv::adaptiveThreshold( InputArray _src, OutputArray _dst, double maxValue, return; } + CALL_HAL(adaptiveThreshold, cv_hal_adaptiveThreshold, src.data, src.step, dst.data, dst.step, src.cols, src.rows, + maxValue, method, type, blockSize, delta); + Mat mean; if( src.data != dst.data ) @@ -1537,7 +1540,7 @@ void cv::adaptiveThreshold( InputArray _src, OutputArray _dst, double maxValue, if (method == ADAPTIVE_THRESH_MEAN_C) boxFilter( src, mean, src.type(), Size(blockSize, blockSize), - Point(-1,-1), true, BORDER_REPLICATE ); + Point(-1,-1), true, BORDER_REPLICATE|BORDER_ISOLATED ); else if (method == ADAPTIVE_THRESH_GAUSSIAN_C) { Mat srcfloat,meanfloat;