OpenCV图像加法和减法的饱和问题验证

    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;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值