From 1d5f28a44f7cc7154b67170d0f0ba56e27a35b56 Mon Sep 17 00:00:00 2001 From: Kavyansh Tyagi <142140238+KAVYANSHTYAGI@users.noreply.github.com> Date: Tue, 3 Feb 2026 13:32:34 +0530 Subject: [PATCH] Fix Laplacian kernel precision for double inputs --- modules/imgproc/src/deriv.cpp | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/modules/imgproc/src/deriv.cpp b/modules/imgproc/src/deriv.cpp index 4e5c0f986b..b4af465cfa 100644 --- a/modules/imgproc/src/deriv.cpp +++ b/modules/imgproc/src/deriv.cpp @@ -715,15 +715,30 @@ void cv::Laplacian( InputArray _src, OutputArray _dst, int ddepth, int ksize, ddepth = sdepth; _dst.create( _src.size(), CV_MAKETYPE(ddepth, cn) ); + int ktype = std::max(CV_32F, std::max(ddepth, sdepth)); + Mat kernel; + if( ksize == 1 || ksize == 3 ) { - float K[2][9] = + static const double K[2][9] = { { 0, 1, 0, 1, -4, 1, 0, 1, 0 }, { 2, 0, 2, 0, -8, 0, 2, 0, 2 } }; - Mat kernel(3, 3, CV_32F, K[ksize == 3]); + kernel.create(3, 3, ktype); + if (ktype == CV_32F) + { + float* kptr = kernel.ptr(); + for (int i = 0; i < 9; ++i) + kptr[i] = static_cast(K[ksize == 3][i]); + } + else + { + double* kptr = kernel.ptr(); + for (int i = 0; i < 9; ++i) + kptr[i] = K[ksize == 3][i]; + } if( scale != 1 ) kernel *= scale; @@ -735,20 +750,10 @@ void cv::Laplacian( InputArray _src, OutputArray _dst, int ddepth, int ksize, if( ksize == 1 || ksize == 3 ) { - float K[2][9] = - { - { 0, 1, 0, 1, -4, 1, 0, 1, 0 }, - { 2, 0, 2, 0, -8, 0, 2, 0, 2 } - }; - Mat kernel(3, 3, CV_32F, K[ksize == 3]); - if( scale != 1 ) - kernel *= scale; - filter2D( _src, _dst, ddepth, kernel, Point(-1, -1), delta, borderType ); } else { - int ktype = std::max(CV_32F, std::max(ddepth, sdepth)); int wdepth = sdepth == CV_8U && ksize <= 5 ? CV_16S : sdepth <= CV_32F ? CV_32F : CV_64F; int wtype = CV_MAKETYPE(wdepth, cn); Mat kd, ks;