OpenCV中图像算术操作与逻辑操作

时间:2022-10-18 09:04:37

OpenCV中图像算术操作与逻辑操作

在图像处理中有两类最重要的基础操作各自是图像点操作与块操作。简单点说图像点操作就是图像每一个像素点的相关逻辑与几何运算、块操作最常见就是基于卷积算子的各种操作、实现各种不同的功能。今天小编就跟大家一起学习OpenCV中图像点操作相关的函数与应用场景。

常见算术运算包含加、减、乘、除,逻辑运算包含与、或、非、异或。

准备工作:

选择两张大小一致的图像例如以下、载入成功以后显演示样例如以下:

OpenCV中图像算术操作与逻辑操作

OpenCV中图像算术操作与逻辑操作

加法操作结果例如以下:

OpenCV中图像算术操作与逻辑操作

减法操作结果例如以下:

OpenCV中图像算术操作与逻辑操作

乘法操作结果例如以下:

OpenCV中图像算术操作与逻辑操作

除法操作结果例如以下:

OpenCV中图像算术操作与逻辑操作

权重加法操作结果例如以下:

OpenCV中图像算术操作与逻辑操作

异或与非操作结果例如以下:

OpenCV中图像算术操作与逻辑操作

代码例如以下:

Mat src1, src2, dst;
src1 = imread("D:/vcprojects/images/test1.png");
src2 = imread("D:/vcprojects/images/moon.png"); const char* input_title1 = "input image - 1";
const char* input_title2 = "input image - 2"; namedWindow(input_title1, CV_WINDOW_AUTOSIZE);
namedWindow(input_title2, CV_WINDOW_AUTOSIZE); imshow(input_title1, src1);
imshow(input_title2, src2); // create result windows and background image
const char* output_title = "result image";
namedWindow(output_title, CV_WINDOW_AUTOSIZE);
Mat bgImg = Mat(src1.size(), src1.type());
Mat whiteImg = Mat(src1.size(), src1.type());
whiteImg = Scalar(255, 255, 255); // 暂时图像
Mat skel(src1.size(), CV_8UC1, Scalar(0));
Mat temp(src1.size(), CV_8UC1);
Mat element = getStructuringElement(MORPH_CROSS, Size(3, 3), Point(-1, -1));
bool done = false;
int index = 9, c;
while (true) {
switch (index) {
case 1:
// 加操作
add(src1, src2, dst, Mat(), -1);
imshow(output_title, dst);
break;
case 2:
// 减操作
subtract(src1, src2, dst, Mat(), -1);
imshow(output_title, dst);
break;
case 3:
// 乘操作
bgImg = Scalar(2, 2, 2);
multiply(src1, bgImg, dst, 1.0, -1);
imshow(output_title, dst);
break;
case 4:
// 除操作
bgImg = Scalar(2, 2, 2);
divide(src1, bgImg, dst, 1.0, -1);
imshow(output_title, dst);
break;
case 5:
// 基于权重加法 - 调节亮度
addWeighted(src1, 1.5, src2, 0.5, 0, dst, -1);
imshow(output_title, dst);
break;
case 6:
// 逻辑非
bitwise_not(src1, dst, Mat());
imshow(output_title, dst);
break;
case 7:
subtract(whiteImg, src1, dst, Mat(), -1);
imshow(output_title, dst);
break;
case 8:
// 逻辑异或
bgImg = Scalar(255, 255, 255);
bitwise_xor(src1, bgImg, dst, Mat());
imshow(output_title, dst);
break;
default:
imshow(output_title, src2);
break;
} c = waitKey(500);
if ((char)c == 27) {
break;
}
if(c > 0) {
index = c % 9;
}
}

此外我们还能够基于逻辑操作与形态学的腐蚀操作实现二值图像的骨架提取,Demo演示结果例如以下:

OpenCV中图像算术操作与逻辑操作

代码实现例如以下:

    // 提取骨架
// 转灰度与二值化
cvtColor(src1, src1, COLOR_BGR2GRAY);
threshold(src1, dst, 127, 255, CV_THRESH_BINARY);
//bitwise_not(src1, src1); do {
// 开操作 - 确保去掉小的干扰块
morphologyEx(src1, temp, MORPH_OPEN, element);
// 取反操作
bitwise_not(temp, temp);
// 得到与源图像不同
bitwise_and(src1, temp, temp);
// 使用它提取骨架、得到是只比源图像小一个像素
bitwise_or(skel, temp, skel);
// 每次循环腐蚀,通过不断腐蚀的方式得到框架
erode(src1, src1, element); // 对腐蚀之后的图像寻找最大值,假设被全然腐蚀则说明
// 只剩下背景黑色、已经得到骨架,退出循环
double max;
minMaxLoc(src1, 0, &max);
done = (0 == max); } while (!done); // 显示骨架
imshow(output_title, skel);

总结:

通过上述代码演示。能够发现简单的图像算术运算也能够发挥大作用。基于黑色背景图像与原图权重叠加能够实现图像亮度调整、基于乘法能够实现对照度调整。基于逻辑操作与腐蚀操作能够实现二值图像的骨架提取。