1. 加法运算
(1) cv::add()
或 +
运算符
功能:对两幅图像的像素值相加(饱和操作,防止溢出)。
公式:dst(x,y)=saturate(src1(x,y)+src2(x,y))
示例:
// C++ cv::Mat img1 = cv::imread("image1.jpg"); cv::Mat img2 = cv::imread("image2.jpg"); cv::Mat result; cv::add(img1, img2, result); // 或 result = img1 + img2;
(2) 加权加法 cv::addWeighted()
功能:线性混合两幅图像(类似透明度叠加)。
公式:dst(x,y)=α⋅src1(x,y)+β⋅src2(x,y)+γ
示例:
// C++ cv::addWeighted(img1, 0.7, img2, 0.3, 0, result); // 70% img1 + 30% img2
2. 减法运算
(1) cv::subtract()
或 -
运算符
功能:对两幅图像的像素值相减(结果非负)。
公式:dst(x,y)=saturate(src1(x,y)−src2(x,y))
示例:
// C++ cv::subtract(img1, img2, result); // 或 result = img1 - img2;
(2) 绝对值减法 cv::absdiff()
功能:计算两幅图像差的绝对值(用于差异检测)。
公式:dst(x,y)=∣src1(x,y)−src2(x,y)∣
示例:
// C++ cv::absdiff(img1, img2, result); // 常用运动检测
3. 图像融合(Blending)
(1) 线性混合 addWeighted
见前文 加权加法 部分。
(2) 掩膜混合 copyTo
功能:通过掩膜(Mask)控制混合区域。
示例:
// C++ cv::Mat mask = cv::imread("mask.jpg", cv::IMREAD_GRAYSCALE); img2.copyTo(result, mask); // 仅在 mask 非零处复制 img2
4. 位运算(Bitwise Operations)
适用于二值图像或掩膜操作。
函数 | 作用 | 示例 |
---|---|---|
cv::bitwise_and() |
按位与(交集) | cv::bitwise_and(img1, img2, dst) |
cv::bitwise_or() |
按位或(并集) | cv::bitwise_or(img1, img2, dst) |
cv::bitwise_xor() |
按位异或(差异) | cv::bitwise_xor(img1, img2, dst) |
cv::bitwise_not() |
按位取反(反色) | cv::bitwise_not(img1, dst) |
示例代码
// C++ cv::Mat mask = cv::Mat::zeros(img1.size(), CV_8UC1); cv::circle(mask, cv::Point(100,100), 50, cv::Scalar(255), -1); // 创建圆形掩膜 cv::Mat and_result, or_result, not_result; cv::bitwise_and(img1, img2, and_result, mask); // 带掩膜的按位与 cv::bitwise_or(img1, img2, or_result); cv::bitwise_not(img1, not_result); // 反色
5. 关键注意事项
数据类型一致:
参与运算的图像必须具有相同的尺寸、通道数和数据类型(如CV_8UC3
)。饱和操作:
add()
和subtract()
会限制结果在有效范围内(如 0~255)。掩膜的作用:
位运算和copyTo()
可通过掩膜控制操作区域。
应用场景
加法:图像叠加(水印)、光照增强。
减法:背景消除、运动检测。
位运算:ROI 提取、二值图像处理。
融合:图像合成、透明度效果。
通过灵活组合这些操作,可以实现复杂的图像处理效果!