经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。 |
前面介绍的计算最值、平均值等操作都是对一张图像进行处理,接下来将介绍两张图像间像素的相关操作,包含两张图像的比较运算、逻辑运算等。
两张图像的比较运算
OpenCV 4中提供了求取两张图像每一位像素较大或者较小灰度值的max()、min()函数,这两个函数分别比较两个图像中每一位元素灰度值的大小,保留较大(较小)的灰度值,这两个函数的函数原型在代码清单3-13中给出。
代码清单3-13 max()和min()函数原型
1. void cv::max(InputArray src1,
2. InputArray src2,
3. OutputArray dst
4. )
5. void cv::min(InputArray src1,
6. InputArray src2,
7. OutputArray dst
8. )
- src1:第一个图像矩阵,可以是任意通道数的矩阵。
- src2:第二个图像矩阵,尺寸和通道数以及数据类型都需要与src1一致。
- dst:保留对应位置较大(较小)灰度值后的图像矩阵,尺寸、通道数和数据类型与src1一致。
该函数的功能相对来说比较简单,就是比较图像每个像素的大小,按要求保留较大值或者较小值,最后生成新的图像。例如,第一张图像 位置像素值为100,第二张图像 位置像素值为10,那么输出图像 位置像素值为100。在代码清单3-14中给出了这两个函数的代码实现过程以及运算结果,运算结果在图3-9、图3-10和图3-11中给出。这种比较运算主要用在对矩阵类型数据的处理,与掩模图像进行比较运算可以实现抠图或者选择通道的效果。
代码清单3-14 myMaxAndMin.cpp两个矩阵或图像进行比较运算
1. #include <opencv2\opencv.hpp>
2. #include <iostream>
3. #include <vector>
4.
5. using namespace std;
6. using namespace cv;
7.
8. int main()
9. {
10. float a[12] = {
1, 2, 3.3, 4, 5, 9, 5, 7, 8.2, 9, 10, 2 };
11. float b[12] = {
1, 2.2, 3, 1, 3, 10, 6, 7, 8, 9.3, 10, 1 };
12. Mat imga = Mat(3, 4, CV_32FC1, a);
13. Mat imgb = Mat(3, 4, CV_32FC1, b);
14. Mat imgas = Mat(2, 3