当前位置: 首页 > article >正文

【OpenCV图像处理】三、图像的逻辑运算

图像的逻辑运算就是将两幅图像的对应像素进行逻辑运算。逻辑运算主要包括 与(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;
}

上面程序中采用了两种方法进行图像求补的操作,程序运行的结果为:




http://www.lryc.cn/news/2413523.html

相关文章:

  • winrar3.93
  • 某东令牌价js加密
  • 解决目前阶段翻译插件Translation谷歌翻译的问题
  • gameloft java 游戏_每一款JAVA游戏都是经典,但只有四款游戏,是90%玩家从小玩到大...
  • 绿坝花季护航,为何如此吸引眼球?
  • Oracle sql 复习题目总结
  • DDD 领域驱动设计落地实践系列:战略设计和战术设计
  • PCI简易通讯控制器驱动的安装办法
  • 【算法】----完全背包问题(动态规划)
  • 编程行业里面的新行话
  • 双重标准? Retina屏科学原理
  • ScriptManager的用法
  • Initialization error Could not initializa “D:\app\Administrator\product\11.2.0\dbhome_1\bin\oci...“
  • 视频转gif图片格式-好用的软件
  • Flash组件按钮的使用详解
  • 程序员怎么学?看完这一篇就够了【非常详细】 从零基础入门到精通!
  • 游戏中的寻路算法研究:关于网格
  • 贱男村001号文件
  • 电脑报网站使用盗版软件?
  • com.android.gallery3d文件夹,如何在Android Gallery3D(cooliris)中显示特定文件夹?
  • VMware虚拟机保姆级安装及使用教程
  • delphi学习总结
  • 事务在触发器中结束。批处理已中止。_Introduction to DDIA amp; 6.824(八):分布式事务...
  • 怎样修改一个正在运行的soket的端口
  • 正弦波振荡的常见电路
  • 一个超火的网站“Omegle”
  • 搭建java环境与编译工具安装
  • ansi c标准_钢管 tube和pipe区别,国外钢管标准规范中pipe与tube的用法及中文译名(钢管Tube与Pipe的区别)...
  • 黑莓系统可以玩java吗_黑莓开发环境搭建windows7+eclipse+BlackBerry Java Plug+JDK6
  • 数学软件Maple使用教程