Added ippiThreshold to cv::threshold
authorAlexander Karsakov <alexander.karsakov@itseez.com>
Fri, 4 Apr 2014 11:07:17 +0000 (15:07 +0400)
committerAlexander Karsakov <alexander.karsakov@itseez.com>
Wed, 9 Apr 2014 07:41:35 +0000 (11:41 +0400)
modules/imgproc/src/thresh.cpp

index 7fd0b23..440f15a 100644 (file)
@@ -53,11 +53,14 @@ thresh_8u( const Mat& _src, Mat& _dst, uchar thresh, uchar maxval, int type )
     uchar tab[256];
     Size roi = _src.size();
     roi.width *= _src.channels();
+    size_t src_step = _src.step;
+    size_t dst_step = _dst.step;
 
     if( _src.isContinuous() && _dst.isContinuous() )
     {
         roi.width *= roi.height;
         roi.height = 1;
+        src_step = dst_step = roi.width;
     }
 
 #ifdef HAVE_TEGRA_OPTIMIZATION
@@ -65,6 +68,25 @@ thresh_8u( const Mat& _src, Mat& _dst, uchar thresh, uchar maxval, int type )
         return;
 #endif
 
+#ifdef HAVE_IPP
+    IppiSize sz = { roi.width, roi.height };
+    switch( type )
+    {
+    case THRESH_TRUNC:
+        if (0 <= ippiThreshold_GT_8u_C1R(_src.data, (int)src_step, _dst.data, (int)dst_step, sz, thresh))
+            return;
+        break;
+    case THRESH_TOZERO:
+        if (0 <= ippiThreshold_LTVal_8u_C1R(_src.data, (int)src_step, _dst.data, (int)dst_step, sz, thresh+1, 0))
+            return;
+        break;
+    case THRESH_TOZERO_INV:
+        if (0 <= ippiThreshold_GTVal_8u_C1R(_src.data, (int)src_step, _dst.data, (int)dst_step, sz, thresh, 0))
+            return;
+        break;
+    }
+#endif
+
     switch( type )
     {
     case THRESH_BINARY:
@@ -112,8 +134,8 @@ thresh_8u( const Mat& _src, Mat& _dst, uchar thresh, uchar maxval, int type )
 
         for( i = 0; i < roi.height; i++ )
         {
-            const uchar* src = (const uchar*)(_src.data + _src.step*i);
-            uchar* dst = (uchar*)(_dst.data + _dst.step*i);
+            const uchar* src = (const uchar*)(_src.data + src_step*i);
+            uchar* dst = (uchar*)(_dst.data + dst_step*i);
 
             switch( type )
             {
@@ -231,8 +253,8 @@ thresh_8u( const Mat& _src, Mat& _dst, uchar thresh, uchar maxval, int type )
     {
         for( i = 0; i < roi.height; i++ )
         {
-            const uchar* src = (const uchar*)(_src.data + _src.step*i);
-            uchar* dst = (uchar*)(_dst.data + _dst.step*i);
+            const uchar* src = (const uchar*)(_src.data + src_step*i);
+            uchar* dst = (uchar*)(_dst.data + dst_step*i);
             j = j_scalar;
 #if CV_ENABLE_UNROLLED
             for( ; j <= roi.width - 4; j += 4 )
@@ -276,6 +298,7 @@ thresh_16s( const Mat& _src, Mat& _dst, short thresh, short maxval, int type )
     {
         roi.width *= roi.height;
         roi.height = 1;
+        src_step = dst_step = roi.width;
     }
 
 #ifdef HAVE_TEGRA_OPTIMIZATION
@@ -283,6 +306,25 @@ thresh_16s( const Mat& _src, Mat& _dst, short thresh, short maxval, int type )
         return;
 #endif
 
+#ifdef HAVE_IPP
+    IppiSize sz = { roi.width, roi.height };
+    switch( type )
+    {
+    case THRESH_TRUNC:
+        if (0 <= ippiThreshold_GT_16s_C1R(src, (int)src_step*sizeof(src[0]), dst, (int)dst_step*sizeof(dst[0]), sz, thresh))
+            return;
+        break;
+    case THRESH_TOZERO:
+        if (0 <= ippiThreshold_LTVal_16s_C1R(src, (int)src_step*sizeof(src[0]), dst, (int)dst_step*sizeof(dst[0]), sz, thresh+1, 0))
+            return;
+        break;
+    case THRESH_TOZERO_INV:
+        if (0 <= ippiThreshold_GTVal_16s_C1R(src, (int)src_step*sizeof(src[0]), dst, (int)dst_step*sizeof(dst[0]), sz, thresh, 0))
+            return;
+        break;
+    }
+#endif
+
     switch( type )
     {
     case THRESH_BINARY:
@@ -455,6 +497,25 @@ thresh_32f( const Mat& _src, Mat& _dst, float thresh, float maxval, int type )
         return;
 #endif
 
+#ifdef HAVE_IPP
+    IppiSize sz = { roi.width, roi.height };
+    switch( type )
+    {
+    case THRESH_TRUNC:
+        if (0 <= ippiThreshold_GT_32f_C1R(src, (int)src_step*sizeof(src[0]), dst, (int)dst_step*sizeof(dst[0]), sz, thresh))
+            return;
+        break;
+    case THRESH_TOZERO:
+        if (0 <= ippiThreshold_LTVal_32f_C1R(src, (int)src_step*sizeof(src[0]), dst, (int)dst_step*sizeof(dst[0]), sz, thresh+FLT_EPSILON, 0))
+            return;
+        break;
+    case THRESH_TOZERO_INV:
+        if (0 <= ippiThreshold_GTVal_32f_C1R(src, (int)src_step*sizeof(src[0]), dst, (int)dst_step*sizeof(dst[0]), sz, thresh, 0))
+            return;
+        break;
+    }
+#endif
+
     switch( type )
     {
         case THRESH_BINARY: