图像的逻辑运算就是将两幅图像的对应像素进行逻辑运算。逻辑运算主要包括 与(AND)或(OR)及补运算。要对灰度图像进行逻辑运算,就要首先对图像进行二值化处理。
图像的二值化处理在上一篇中已经叙述完毕,这篇主要写图像的与,或和补三种逻辑运算。
在OpenCV中,除了本文中所提到的使用类似的函数进行图像的逻辑运算外,还可以直接使用逻辑运算符进行操作,例如在求两个图像的或时,可以直接使用如下语句:
resultOr = (img1 | img2);
因为在Mat类中已经为我们重载了这些运算符。灵活的使用运算符可以给我们带来很大的方便
在这里再次感谢周师兄的提醒~ :D
1.与运算
图像的与运算就是将两幅二值图像的对应像素进行逻辑与操作,如果处理的图像不是二值图像,那么要先进行二值化处理。
可以用来求得两幅尺寸相同的图像的相交区域。
使用OpenCV编程也十分简单,将两幅图像按像素进行与操作即可。
相关代码如下:
//二值图像的逻辑与(AND)运算
#include <iostream>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat imag1, imag2, result;
//imag1和imag2都是单通道的二值图像
imag1 = imread("1234.jpg");
imag2 = imread("2345.jpg");
result = imag1.clone();
//进行遍历像素即可
int rowNumber = result.rows;
int colNumber = result.cols;
for (int i = 0; i < rowNumber; i++)
{
for (int j = 0; j < colNumber; j++)
{
result.at<uchar>(i,j) = imag1.at<uchar>(i,j)&& imag2.at<uchar>(i,j);
}
}
imshow("原图1", imag1);
imshow("原图2", imag2);
imshow("逻辑与后的图像", result);
waitKey();
return 0;
}
2.或运算
或运算和与运算操作方法类似,只是将两幅图像的对应像素该位进行或运算即可,同样的,如果处理的图像不是二值图像,则应该首先对图像进行二值化。
相关代码如下:
//二值图像的逻辑或(OR)运算
#include <iostream>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat imag1, imag2, result;
//imag1和imag2都是单通道的二值图像
imag1 = imread("1234.jpg");
imag2 = imread("2345.jpg");
result = imag1.clone();
//进行遍历像素即可
int rowNumber = result.rows;
int colNumber = result.cols;
for (int i = 0; i < rowNumber; i++)
{
for (int j = 0; j < colNumber; j++)
{
result.at<uchar>(i, j) = imag1.at<uchar>(i, j) || imag2.at<uchar>(i, j);
}
}
imshow("原图1", imag1);
imshow("原图2", imag2);
imshow("逻辑与后的图像", result);
waitKey();
return 0;
}
3.补运算
补运算是对二值图像的每个像素取逻辑非。同样的如果处理的不是二值图像,也要先进行二值化处理。此外在OpenCV中对一幅二值化图像求补运算除了可以用按像素求补外还可以直接使用求反的符号“~”,如“~imag1”就是对imag1进行求补操作
相关的实现代码如下:
//对二值图像进行求补运算
#include <iostream>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat imag, result1,result2;
imag = imread("二值图.jpg");
result1 = result2 = imag.clone();
result1 = ~imag;
int rowNumber = result2.rows;
int colNumber = result2.cols;
for (int i = 0; i < rowNumber; i++)
{
for (int j = 0; j < colNumber; j++)
{
//求补操作
result2.at<uchar>(i, j) = 255 - imag.at<uchar>(i, j);
}
}
imshow("原图像", imag);
imshow("result1", result1);
imshow("result2", result2);
waitKey();
return 0;
}
上面程序中采用了两种方法进行图像求补的操作,程序运行的结果为: