OpenCV做图像加减是,存在数据类型导致数据饱和的问题,总结如下:
+,-,addWeighted,会根据输入图像进行数据饱和判断,如果大于255,结果等于255,如果小于0,结果=0。
add,subtract会根据参数中的dtype来决定用不用做饱和,如果dtype=-1,结果类型等同于原类型,会饱和,否则根据输出类型得到结果。
absdiff是算的绝对值差,类似于dst(i,j)=abs(src1(i,j)-src2(i,j));
下面是例程是加法和减法的实验验证。
Mat test1=Mat(1,1,CV_8UC1),test2=Mat(1,1,CV_8UC1);
test1.setTo(255);
test2.setTo(10);
Mat test3=Mat::zeros(1,1,CV_16SC1),test4=Mat::zeros(1,1,CV_16SC1);
/*************************add*********************************/
std::string str="/*************************add*********************************/";
cout<<str<<endl<<endl;
test3=test1+test2;
cout<<"test1+test2: test3="<<test3.at<short>(0,0)<<endl<<endl;
add(test1,test2,test3,noArray(),CV_16SC1);
cout<<"add: test3="<<test3.at<short>(0,0)<<endl<<endl;
addWeighted(test1,1,test2,1,0,test3);
cout<<"addWeighted: test3="<<test3.at<short>(0,0)<<endl<<endl;
/*************************subtract*********************************/
str="/*************************subtract*********************************/";
cout<<str<<endl<<endl;
test3=test1-test2;
cout<<"test1-test2: test3="<<test3.at<short>(0,0)<<" ";
test4=test2-test1;
cout<<"test4="<<test4.at<short>(0)<<endl<<endl;
subtract(test1,test2,test3,noArray(),CV_16SC1);
cout<<"subtract: test3="<<test3.at<short>(0,0)<<" ";
subtract(test2,test1,test4,noArray(),CV_16SC1);
cout<<"test4="<<test4.at<short>(0,0)<<endl<<endl;
absdiff(test1,test2,test3);
cout<<"absdiff: test3="<<test3.at<short>(0,0)<<" ";
absdiff(test2,test1,test4);
cout<<"test4="<<test4.at<short>(0,0)<<endl<<endl;
addWeighted(test1,1,test2,-1,0,test3);
cout<<"addWeighted: test3="<<test3.at<short>(0,0)<<" ";
addWeighted(test2,1,test1,-1,0,test4);
cout<<"test4="<<test4.at<short>(0,0)<<endl<<endl;
int dif1=test1.at<uchar>(0,0)-test2.at<uchar>(0,0);
int dif2=test2.at<uchar>(0,0)-test1.at<uchar>(0,0);
cout<<" dif1= "<<dif1<<" dif2= "<<dif2<<endl;