void add(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray(), int dtype=-1);
void subtract(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray(), int dtype=-1);
void multiply(InputArray src1, InputArray src2, OutputArray dst, double scale=1, int dtype=-1);
void divide(InputArray src1, InputArray src2, OutputArray dst, double scale=1, int dtype=-1);
void divide(double scale, InputArray src2, OutputArray dst, int dtype=-1);
void scaleAdd(InputArray src1, double alpha, InputArray src2, OutputArray dst);
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
与此类似的还有位运算函数:
void bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray());
void bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray());
void bitwise_xor(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray());
void bitwise_not(InputArray src, OutputArray dst, InputArray mask=noArray());
比较常用的运算是求两幅图像像素的差的绝对值。
void absdiff(InputArray src1, InputArray src2, OutputArray dst);
还有些函数是对单幅图像进行操作的,比如对每个像素的值取平方、平方根、对数等。
void sqrt(InputArray src, OutputArray dst);
void pow(InputArray src, double power, OutputArray dst);
void exp(InputArray src, OutputArray dst);
void log(InputArray src, OutputArray dst);
int height = src.rows; // 图像高度
int width = src.cols; // 图像宽度(像素为单位)
int step = src.step; // 相邻行的同列点之间的字节数
int channels = src.channels(); // 颜色通道数目 (1,2,3,4)
uchar *data = (uchar *)src.data;
for (int i = 0; i != height; ++i)
{
for (int j = 0; j != width; ++j)
{
for (int k = 0; k != channels; ++k)
{
data[i*step + j*channels + k] = 255;
}
}
}
或者:
for (int i = 0;i < src.rows;i++)
{
uchar* current_src = src.ptr< uchar>(i);
uchar* current_dst = dst.ptr< uchar>(i);
for (int j = 0;j < src.cols;j++)
{
if (current_src[j]==0)
{
current_dst[j] = 255;
}
}
}
下面给出指数变换的实例:
int gammm(Mat& src,double g, Mat& dst)
{
Mat table,d;
for (int i = 0;i < 256;i++)
{
table.push_back((int)(255*pow(i / 255.0, g)));
//cout << (int)(255 * pow(i / 255.0, g)) << " ,";
}
LUT(src,table,d); //查表
d.convertTo(dst,CV_8U);
return 0;
}
gammm(img, 0.5, dst);
更多内容关注微信公众号:ML_Study