diff --git a/modules/imgproc/src/spatialgradient.cpp b/modules/imgproc/src/spatialgradient.cpp index 056adc575..644f1a304 100644 --- a/modules/imgproc/src/spatialgradient.cpp +++ b/modules/imgproc/src/spatialgradient.cpp @@ -284,23 +284,39 @@ void spatialGradient( InputArray _src, OutputArray _dx, OutputArray _dy, * 1 2 1 */ int j_p, j_n; + uchar v00, v01, v02, v10, v11, v12, v20, v21, v22; for ( i = 0; i < H; i++ ) { p_src = P_src[i]; c_src = P_src[i+1]; n_src = P_src[i+2]; c_dx = P_dx [i]; c_dy = P_dy [i]; - for ( j = i >= i_start ? 0 : j_start; j < W; j++ ) + // Pre-load 2 columns + j = i >= i_start ? 0 : j_start; + j_p = j - 1; + if ( j_p < 0 ) j_p = j + j_offl; + v00 = p_src[j_p]; v01 = p_src[j]; + v10 = c_src[j_p]; v11 = c_src[j]; + v20 = n_src[j_p]; v21 = n_src[j]; + + for ( ; j < W; j++ ) { j_p = j - 1; j_n = j + 1; if ( j_p < 0 ) j_p = j + j_offl; if ( j_n >= W ) j_n = j + j_offr; - c_dx[j] = -(p_src[j_p] + c_src[j_p] + c_src[j_p] + n_src[j_p]) + - (p_src[j_n] + c_src[j_n] + c_src[j_n] + n_src[j_n]); - c_dy[j] = -(p_src[j_p] + p_src[j] + p_src[j] + p_src[j_n]) + - (n_src[j_p] + n_src[j] + n_src[j] + n_src[j_n]); + // Get values for next column + v02 = p_src[j_n]; + v12 = c_src[j_n]; + v22 = n_src[j_n]; + + c_dx[j] = -(v00 + v10 + v10 + v20) + (v02 + v12 + v12 + v22); + c_dy[j] = -(v00 + v01 + v01 + v02) + (v20 + v21 + v21 + v22); + + // Move values back one column for next iteration + v00 = v01; v10 = v11; v20 = v21; + v01 = v02; v11 = v12; v21 = v22; } }