有很多函数有mask,代表掩码,如果某位mask是0,那么对应的src的那一位就不计算,mask要和矩阵/ROI/的大小相等大多数函数支持ROI,如果图像ROI被设置,那么只处理ROI部分少部分函数支持COI,如果COI设置,只处理感兴趣的通道
矩阵逻辑运算void cvAnd(const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL);//两数组按位与计算如果mask非空void cvAndS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL);//数组与标量位与计算如果mask非空void cvOr(const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL);//
void cvOrS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL);//
void cvXor(const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL);//
void cvXorS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL);//
void cvNot(const CvArr* src,CvArr* dst);//矩阵取反
矩阵算术运算绝对值void cvAbs(const CvArr* src,CvArr* dst);//计算src里的绝对值,把结果写到dst
void cvAbsDiff(const CvArr* src1,const CvArr* src2, CvArr* dst);//两矩阵相减取绝对值写到dst
void cvAbsDiffS(const CvArr* src, CvArr* dst,CvScalar value);//矩阵减去一个数取绝对值加减void cvAdd(const CvArr* src1,const CvArr* src2,CvArr* dst,const CvArr* mask = NULL);//两数组相加,dst(I)=src1(I)+src2(I) if mask(I)!=0
void cvAddS(const CvArr* src,CvScalar value,CvArr*dst,const CvArr* mask = NULL);//数组和一个数相加,dst(I)=src(I)+value if mask(I)!=0
void cvAddWeighted(const CvArr* src1,double alpha,const CvArr* src2,double beta,double gamma,CvArradded to each sum* dst);//带权相加相当于dst(x,y) = α *src1(x,y) + β *src2(x,y) + γ
此函数可以实现两个图像的alpha融合(两个原图像和dst的ROI必须统一尺寸)。
标准融合公式:dst(x,y) = α *src1(x,y) +(1-α)*src2(x,y)
如下代码内容:将两张图片的ROI融合输出
#include
#include
#include
int main(int argc, char** argv)
{
IplImage *src1, *src2;
if( argc == 9 && ((src1=cvLoadImage(argv[1],1)) != 0
)&&((src2=cvLoadImage(argv[2],1)) != 0 ))
{
int x = atoi(argv[3]);
int y = atoi(argv[4]);
int width = atoi(argv[5]);
int height = atoi(argv[6]);
double alpha = (double)atof(argv[7]);
double beta = (double)atof(argv[8]);
cvSetImageROI(src1, cvRect(x,y,width,height));
cvSetImageROI(src2, cvRect(0,0,width,height));
cvAddWeighted(src1, alpha, src2, beta,0.0,src1);
cvResetImageROI(src1);
cvNamedWindow( "Alpha_blend", 1 );
cvShowImage( "Alpha_blend", src1 );
cvWaitKey();
}
else
printf("Couldn't load one or both of %s, %s\n",argv[1],argv[2]);
return 0;
}
void cvSub(const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL);//矩阵减法,dst(I)=src1(I)-src2(I) if mask(I)!=0
void cvSubS(const CvArr* sr