求取两幅图像每一个像素较大或者较小灰度值的max()、min()函数,这两个函数分别比较两幅图像每一个元素的灰度值大小,保留较大(较小)的灰度值。
max()、min()函数原型
void cv::max(InputArray src1, InputArray src2, OutputArray dst)
void cv::min(InputArray src1, InputArray src2, OutputArray dst)
其中,src1:第一个图像矩阵,可以是任意通道数的矩阵。src2:第二个图像矩阵,尺寸和通道数及数据类型都需要与src1保持一致。dst:保留对应位置较大(较小)灰度值后的图像矩阵,尺寸、通道数和数据类型与src1保持一致。
例子:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <vector>
using namespace std;
using namespace cv;
int main()
{
float a[12] = { 1, 2, 3.3, 4, 5, 9, 5, 7, 8.2, 9, 10, 2 };
float b[12] = { 1, 2.2, 3, 1, 3, 10, 6, 7, 8, 9.3, 10, 1 };
Mat imga = Mat(3, 4, CV_32FC1, a);
Mat imgb = Mat(3, 4, CV_32FC1, b);
Mat imgas = Mat(2, 3, CV_32FC2, a);
Mat imgbs = Mat(2, 3, CV_32FC2, b);
//对两个单通道矩阵进行比较运算
Mat myMax, myMin;
max(imga, imgb, myMax);
min(imga, imgb, myMin);
//对两个多通道矩阵进行比较运算
Mat myMaxs, myMins;
max(imgas, imgbs, myMaxs);
min(imgas, imgbs, myMins);
//对两张彩色图像进行比较运算
Mat img0 = imread("D:\\lena.jpg"); //尺寸219*220
Mat img1 = imread("D:\\dijia.png");//尺寸464*688
if (img0.empty() || img1.empty())
{
cout << "请确认图像文件名称是否正确" << endl;
return -1;
}
Mat comMin, comMax,temp;
//确保两幅图片尺寸一样
Rect rect1(300, 200, 220, 219);
img1 = img1(rect1);
cout << img0.size << endl;
cout << img1.size << endl;
imshow("lena", img0);
imshow("dijia", img1);
max(img0, img1, comMax);
min(img0, img1, comMin);
imshow("comMin", comMin);
imshow("comMax", comMax);
//与掩模进行比较运算
Mat src1 = Mat::zeros(Size(220, 219), CV_8UC3);
Rect rect(50, 50, 150, 150); //Rect为矩形类,前两个参数表示矩形左上顶点坐标,后两个参数表示长宽
src1(rect) = Scalar(255, 255, 255); //生成一个低通150*150的掩模
Mat comsrc1, comsrc2;
cout << img0.size << endl;
cout << src1.size << endl;
min(img0, src1, comsrc1);
imshow("comsrc1", comsrc1);
Mat src2 = Mat(219, 220, CV_8UC3, Scalar(0, 0, 255)); //生成一个显示红色通道的低通掩模
min(img0, src2, comsrc2);
imshow("comsrc2", comsrc2);
//对两张灰度图像进行比较运算
Mat img0G, img1G, comMinG, comMaxG;
cvtColor(img0, img0G, COLOR_BGR2GRAY);
cvtColor(img1, img1G, COLOR_BGR2GRAY);
max(img0G, img1G, comMaxG);
min(img0G, img1G, comMinG);
imshow("comMinG", comMinG);
imshow("comMaxG", comMaxG);
waitKey(0);
return 0;
}
结果如图
逻辑运算函数原型
//像素求“与”运算
void cv::bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray())
//像素求“或”运算
void cv::bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray())
//像素求“异或”运算
void cv::bitwise_xor(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray() )
//像素求“非”运算
void cv::bitwise_not(InputArray src, OutputArray dst, InputArray mask = noArray())
其中,src1:第一个图像矩阵,可以是多通道图像数据。
src2:第二个图像矩阵,尺寸、通道数和数据类型都需要与src1 一致。
dst :逻辑运算输出结果,尺寸、通道数和数据类型都需要与src1 一致。
mask:掩模,用于设置图像或矩阵中逻辑运算的范围。
像CV_8U类型图像数据,像素值从0~255,逻辑运算时,需像素值转换为二进制再进行运算,例如:对0 求非是 1111 1111
示例:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <vector>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("D:\\dijia.png"); //导入图像
if (img.empty())
{
cout << "请确认图像文件名称是否正确" << endl;
return -1;
}
//创建两个黑白图像
Mat img0 = Mat::zeros(200, 200, CV_8UC1); //200*200单通道
Mat img1 = Mat::zeros(200, 200, CV_8UC1);
Rect rect0(50, 50, 100, 100);
img0(rect0) = Scalar(255);
Rect rect1(100, 100, 100, 100);
img1(rect1) = Scalar(255);
imshow("img0", img0);
imshow("img1", img1);
//进行逻辑运算
Mat myAnd, myOr, myXor, myNot, imgNot;
bitwise_not(img0, myNot);
bitwise_and(img0, img1, myAnd);
bitwise_or(img0, img1, myOr);
bitwise_xor(img0, img1, myXor);
bitwise_not(img, imgNot);
imshow("myAnd", myAnd);
imshow("myOr", myOr);
imshow("myXor", myXor);
imshow("myNot", myNot);
imshow("img", img);
imshow("imgNot", imgNot);
waitKey(0);
return 0;
}
运算结果
(迪迦黑化)