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. V-rep学习笔记:机器人模型创建3—搭建动力学模型

    接着之前写的V-rep学习笔记:机器人模型创建2—添加关节继续机器人创建流程.如果已经添加好关节,那么就可以进入流程的最后一步:搭建层次结构模型和模型定义(build the model hierar ...

  2. INT函数和ROUND

    语法:INT(number) Number 需要进行向下舍入取整的实数

  3. Windows下 VS2015编译RocksDB

    VS2015编译RocksDB RocksDB 是一个来自 facebook 的可嵌入式的支持持久化的 key-value 存储系统,也可作为 C/S 模式下的存储数据库,但主要目的还是嵌入式.Roc ...

  4. error:No buffer space available (maximum connections reached

    2015-02-02 17:49:09,035 ERROR basic.DBManager - Failded to establish the connection. com.mysql.jdbc. ...

  5. 转:Ogre源码分析之Root类、Facade模式

    Ogre源码分析(一)Root类,Facade模式 Ogre中的Root对象是一个Ogre应用程序的主入口点.因为它是整个Ogre引擎的外观(Façade)类.通过Root对象来开启和停止Ogre是最 ...

  6. 图片异步加载之EGOImageLoading

    下载地址  http://pan.baidu.com/share/link?shareid=2690186349&uk=923776187 引入目录 简单实用 http://blog.csdn ...

  7. uiview封装的基本动画

    基本动画的类型为 基本动画的节奏 UIViewAnimationOptionCurveEaseInOut            = 0 << 16, // default UIViewAn ...

  8. [转载]显示SVN控制台

    原文地址:显示SVN控制台作者:瘦骨临清风  青春就应该这样绽放  游戏测试:三国时期谁是你最好的兄弟!!  你不得不信的星座秘密

  9. Oracle中INTERSECT,MINUS,UNION,UNION ALL用法

    intersect 就是交集minus 就是差集 交集就是两个结果集中都有的元素 比如 select uid from tb1 intersect select uid from tb2 那么既存在t ...

  10. 用copy 还是 strong?

    NSArray与NSMutableArray用copy修饰还是strong 这个是原文  http://blog.csdn.net/winzlee/article/details/51752354 一 ...