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);

总结:

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

OpenCV中图像算术操作与逻辑操作的更多相关文章

  1. OpenCV中图像的格式Mat 图像深度

    opencv中图像的格式Mat 有图像的定义,图像深度.类型格式等,其中Mat的参数depth为深度,深度反应出图像颜色像素值: 关于数据的储存:(转) Mat_<uchar>对应的是CV ...

  2. Opencv中图像的遍历与像素操作

    Opencv中图像的遍历与像素操作 OpenCV中表示图像的数据结构是cv::Mat,Mat对象本质上是一个由数值组成的矩阵.矩阵的每一个元素代表一个像素,对于灰度图像,像素是由8位无符号数来表示(0 ...

  3. OpenCV中图像的BGR格式及Img对象的属性说明

    1. 图像的BGR格式说明 OpenCV中图像读入的数据格式是numpy的ndarray数据格式.是BGR格式,取值范围是[0,255]. 如下图所示,分为三个维度: 第一维度:Height 高度,对 ...

  4. [OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (一)

    部分 V图像特征提取与描述 OpenCV-Python 中文教程(搬运)目录 29 理解图像特征 目标本节我会试着帮你理解什么是图像特征,为什么图像特征很重要,为什么角点很重要等.29.1 解释 我相 ...

  5. [OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (二)

    部分 V图像特征提取与描述 OpenCV-Python 中文教程(搬运)目录 34 角点检测的 FAST 算法 目标 • 理解 FAST 算法的基础 • 使用 OpenCV 中的 FAST 算法相关函 ...

  6. opencv中图像伪彩色处理(C++ / Python)

    使用OpenCV的预定义的颜色映射来将灰度图像伪彩色化. 1. colormap(色度图)是什么? 假设我们想在地图上显示美国不同地区的温度.我们可以把美国地图上的温度数据叠加为灰度图像——较暗的区域 ...

  7. 深入学习OpenCV中图像灰度化原理,图像相似度的算法

    最近一段时间学习并做的都是对图像进行处理,其实自己也是新手,各种尝试,所以我这个门外汉想总结一下自己学习的东西,图像处理的流程.但是动起笔来想总结,一下却不知道自己要写什么,那就把自己做过的相似图片搜 ...

  8. OpenCV中图像指针注意点

    1.cvQueryFrame方法从摄像头或文件中抓取的帧图像是不能被释放和修改的 2.不要用delete删除,一定要用cvReleaseImage删除且要带有&符号.

  9. OpenCV中图像以Mat类型保存时各通道数据在内存中的组织形式及python代码访问各通道数据的简要方式

    以最简单的4 x 5三通道图像为例,其在内存中Mat类型的数据组织形式如下: 每一行的每一列像素的三个通道数据组成一个一维数组,一行像素组成一个二维数组,整幅图像组成一个三维数组,即: Mat.dat ...

随机推荐

  1. VBA 一个很神奇的东西

    百度经验参考:http://jingyan.baidu.com/article/4ae03de32663953efe9e6b47.html 今天奇迹般的发现了VBA,都怪自己平时使用excle不够多, ...

  2. 使用Dlib来运行基于CNN的人脸检测

    检测结果如下 这个示例程序需要使用较大的内存,请保证内存足够.本程序运行速度比较慢,远不及OpenCV中的人脸检测. 注释中提到的几个文件下载地址如下 http://dlib.net/face_det ...

  3. android自动化测试--appium运行的坑问题及解决方法

    问题 1. error: Failed to start an Appium session, err was: Error: Requested a new session but one was ...

  4. android官方资料

    android develop – Guides http://developer.android.com/guide/ android develop – API Reference http:// ...

  5. Android拦截外拨电话

    拦截监听外拨的电话,并进行处理: 向外拨打电话时系统会发出一个有序广播,虽然该广播最终会被拔号器里的广播接收者所接收并实现电话拔打,但我们可以在广播传递给拔号广播接收者之前先得到该广播,然后清除传递给 ...

  6. ios中webview的高级用法

    .隐藏上下滚动时出边界的后面的黑色的阴影 - (void) hideGradientBackground:(UIView*)theView { for (UIView * subview in the ...

  7. [转载]virtualbox安装64bit客户机

    原文地址:virtualbox安装64bit客户机作者:kunth 1.虚拟64bit客户机 (1)安装virualbox (2)bios设置 supports virtualization为able ...

  8. linux 版本中 i386/i686/x86-64/pcc 等的区别

    在查看dpdk官方文档的时候,发现有 这样(kernel - devel.x86_64; kernel - devel.ppc64:glibc.i686)这样的安装包信息,收集了点资料来分析这三者的关 ...

  9. 蓝牙进阶之路 (003) - AT指令(转)

    一 . 一 般 命 令 1.AT+CGMI      给出模块厂商的标识. 2.AT+CGMM    获得模块标识.这个命令用来得到支持的频带(GSM 900,DCS 1800    或PCS 190 ...

  10. fedora装机后要运行的脚本(原创)

    脚本:sh.sh #!/bin/zsh #安装rpmfusion源 dnf config-manager --add-repo=http://repo.fdzh.org/FZUG/FZUG.repo ...