Ask Your Question

Pixelwise subtract, with negative numbers

asked 2014-11-02 13:10:06 -0500

kovand11 gravatar image

I would like to implement the following pixelwise operation between two images:

  • Subtract the pixels (RGB) (important: if the result is negative, keep it)
  • Convert to absolute value (RGB)
  • Somehow merge the three channels (for starter, I use the cv::COLOR_RGB2GRAY which is a weighted add)

But, the problem is, that the cv::substract() and the operator - on cv::Mat fails to calculate negative values, and uses 0 instead.

How can I easily implement the behavior I need?

edit retag flag offensive close merge delete

1 answer

Sort by ยป oldest newest most voted

answered 2014-11-02 13:32:50 -0500

rwong gravatar image

updated 2014-11-02 13:34:46 -0500

Option 1

Use cv::absdiff.

Link to documentation

Option 2

When performing the subtraction, specify an "intermediate data depth" capable of storing all possible intermediate values - from the positive limit to the negative limit.


cv::Mat matDiff; // will be filled with result.
cv::Mat matTemp; // temporarily holds the intermediate result.
cv::subtract(matOne, matTwo, matTemp, cv::noArray(), CV_32S);
matTemp = cv::abs(matTemp);
matTemp.convertTo(matDiff, CV_8U); // Or other precisions (depths).

Both options should work. However, if you find that one of the options is not working as documented, be sure to file a bug report or share your findings here. Thanks.

I posted both options because my use of an earlier version of OpenCV had a bug in absdiff that requires the workaround. I haven't checked ever since. Anyone using the advice above should manually verify that the code works on their version of OpenCV before further use.

edit flag offensive delete link more
Login/Signup to Answer

Question Tools


Asked: 2014-11-02 13:10:06 -0500

Seen: 3,767 times

Last updated: Nov 02 '14