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演示结果例如以下:



代码实现例如以下:

    // 提取骨架
// 转灰度与二值化
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);

总结:

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

最新文章

  1. &与&&,|与||
  2. Java多线程系列--“JUC集合”10之 ConcurrentLinkedQueue
  3. HDU5802-windows 10-dfs+贪心
  4. linux中mail函数不能发送邮件
  5. 【转】学习Flex ActionScript 3.0 强烈推荐电子书
  6. VS2015开发的Office Addin部署,安装时报错:无法解析属性“type”的值。
  7. oracle 12c 中asm元数据是否有所变化
  8. 使用Visual Studio 2010 创建简单的Silverlight应用程序
  9. cisco 2950 3550 3750 系列交换机密码破解
  10. Cordova框架基本原理
  11. 消除 ASP.NET Core 告警 "No XML encryptor configured. Key may be persisted to storage in unencrypted form"
  12. 一、大体认识jspxcms
  13. 测试那些事儿—软测必备的Linux知识(四)
  14. ZIP解压缩工具类
  15. 转--Python语言特性
  16. (dp)Tickets --HDU --1260
  17. 通过Python实现一个文档的半自动录入工具
  18. String,StringBuffer和StringBuilder三者的讲解
  19. 【BZOJ3555】[Ctsc2014]企鹅QQ hash
  20. fir 窗口设计法

热门文章

  1. C#中巧用#if DEBUG 进行调试
  2. Windows XPSP3通过网络级身份验证方式连接Windows Server 2008远程桌面
  3. df看到的文件系统容量跟parted看到的分区容量差别较大的解决方法
  4. 安装 directx sdk 出现 S1023 解决
  5. dataset string dataset
  6. js验证身份证类
  7. 【Java】详解java对象的序列化
  8. MySQL-通用查询日志
  9. Linux伙伴算法
  10. Mac OS X 下多个JDK版本的切换小技巧