图像遍历反色处理,遍历多通道图片
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
// 下标M.at<float>(i,j) 方法1-1
cv::Mat inverseColor1(cv::Mat srcImage)
{cv::Mat tempImage = srcImage.clone();int row = tempImage.rows;int col = tempImage.cols;// 分别对各个通道进行反色处理for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){tempImage.at<cv::Vec3b>(i, j)[0] = 255 - tempImage.at<cv::Vec3b>(i, j)[0];tempImage.at<cv::Vec3b>(i, j)[1] = 255 - tempImage.at<cv::Vec3b>(i, j)[1];tempImage.at<cv::Vec3b>(i, j)[2] = 255 - tempImage.at<cv::Vec3b>(i, j)[2];}}return tempImage;
}
// 方法1-2 下标M::at<float>(i,j)
cv::Mat inverseColor2(cv::Mat srcImage)
{cv::Mat tempImage = srcImage.clone();int row = tempImage.rows;// 图像像素行实际的宽度int step = tempImage.step;// 直接对像素进行反色处理for (int i = 0; i < row; i++){for (int j = 0; j < step; j++){tempImage.at<uchar>(i, j) = 255 - tempImage.at<uchar>(i, j);}} return tempImage;
}
// 方法2 指针遍历Mat::ptr
cv::Mat inverseColor3(cv::Mat srcImage)
{cv::Mat tempImage = srcImage.clone();int row = tempImage.rows;// 将3通道转换为单通道int nStep = tempImage.cols * tempImage.channels();for(int i = 0; i < row; i++) {// 取源图像的指针const uchar* pSrcData = srcImage.ptr<uchar>(i);// 将输出数据指针存放输出图像uchar* pResultData = tempImage.ptr<uchar>(i);for(int j=0; j < nStep; j++){pResultData[j]= cv::saturate_cast<uchar>(255 - pSrcData[j]);}}return tempImage;
}
// 方法3 使用迭代器MatConstIterator
cv::Mat inverseColor4(cv::Mat srcImage)
{cv::Mat tempImage = srcImage.clone();// 初始化源图像迭代器cv::MatConstIterator_<cv::Vec3b> srcIterStart = srcImage.begin<cv::Vec3b>();cv::MatConstIterator_<cv::Vec3b> srcIterEnd = srcImage.end<cv::Vec3b>();// 初始化输出图像迭代器cv::MatIterator_<cv::Vec3b> resIterStart = tempImage.begin<cv::Vec3b>();cv::MatIterator_<cv::Vec3b> resIterEnd = tempImage.end<cv::Vec3b>();// 遍历图像反色处理while( srcIterStart != srcIterEnd ){(*resIterStart)[0] = 255 - (*srcIterStart)[0];(*resIterStart)[1] = 255 - (*srcIterStart)[1];(*resIterStart)[2] = 255 - (*srcIterStart)[2];// 迭代器递增srcIterStart++;resIterStart++;}return tempImage;
}// 方法4 改进的指针方法isContinuous
cv::Mat inverseColor5(cv::Mat srcImage)
{int row = srcImage.rows;int col = srcImage.cols;cv::Mat tempImage = srcImage.clone();// 判断是否是连续图像,即是否有像素填充if( srcImage.isContinuous() && tempImage.isContinuous() ){row = 1;col = col * srcImage.rows * srcImage.channels();}// 遍历图像的每个像素for(int i = 0; i < row; i++){const uchar* pSrcData = srcImage.ptr<uchar>(i);uchar* pResultData = tempImage.ptr<uchar>(i);for(int j = 0; j < col; j++){*pResultData++ = 255 - *pSrcData++;}}return tempImage;
}
// 方法5 LUT查表法
cv::Mat inverseColor6(cv::Mat srcImage)
{int row = srcImage.rows;int col = srcImage.cols;cv::Mat tempImage = srcImage.clone();// 建立LUT 反色tableuchar LutTable[256];for (int i = 0; i < 256; ++i)LutTable[i] = 255 - i;cv::Mat lookUpTable(1, 256, CV_8U);uchar* pData = lookUpTable.data; // 建立映射表for( int i = 0; i < 256; ++i)pData[i] = LutTable[i];// 应用索引表进行查找cv::LUT(srcImage, lookUpTable, tempImage);return tempImage;
}int main()
{// 装载图像转为灰度图像cv::Mat srcImage = cv::imread("..\\images\\flower3.jpg");if (!srcImage.data) return -1;cv::imshow("srcImage", srcImage);cv::Mat resultImg1,resultImg2,resultImg3;cv::Mat resultImg4,resultImg5,resultImg6;// 测试方法1-1double tTime;tTime = (double)getTickCount();const int nTimes = 100;for(int i = 0; i < nTimes; i++){resultImg1 = inverseColor1(srcImage);}tTime= 1000*((double)getTickCount() - tTime)/getTickFrequency();tTime /= nTimes;std::cout << "test1-1: " << tTime << std::endl;// 测试方法1-2tTime = (double)getTickCount();for(int i = 0; i < nTimes; i++){resultImg2 = inverseColor2(srcImage);}tTime= 1000*((double)getTickCount() - tTime)/getTickFrequency();tTime /= nTimes;std::cout << "test1-2: " << tTime << std::endl;// 测试方法2tTime = (double)getTickCount();for(int i = 0; i < nTimes; i++){resultImg3 = inverseColor3(srcImage);}tTime= 1000*((double)getTickCount() - tTime)/getTickFrequency();tTime /= nTimes;std::cout << "test2: " << tTime << std::endl;// 测试方法3tTime = (double)getTickCount();for(int i = 0; i < nTimes; i++){resultImg4 = inverseColor4(srcImage);}tTime= 1000*((double)getTickCount() - tTime)/getTickFrequency();tTime /= nTimes;std::cout << "test3: " << tTime << std::endl;// 测试方法4tTime = (double)getTickCount();for(int i = 0; i < nTimes; i++){resultImg5 = inverseColor5(srcImage);}tTime= 1000*((double)getTickCount() - tTime)/getTickFrequency();tTime /= nTimes;std::cout << "test4: " << tTime << std::endl;// 测试方法5tTime = (double)getTickCount();for(int i = 0; i < nTimes; i++){resultImg6 = inverseColor5(srcImage);}tTime= 1000*((double)getTickCount() - tTime)/getTickFrequency();tTime /= nTimes;std::cout << "test5: " << tTime << std::endl;cv::imshow("resultImg1", resultImg1);cv::imshow("resultImg2", resultImg2);cv::imshow("resultImg3", resultImg3);cv::imshow("resultImg4", resultImg4);cv::imshow("resultImg5", resultImg5);cv::imshow("resultImg6", resultImg6);cv::waitKey(0);return 0;
}
转载:http://blog.csdn.net/zhuwei1988
相关文章:

【Treap】bzoj1588-HNOI2002营业额统计
一、题目 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节…

推荐一款 Flutter Push 推送功能插件
又到了推荐好插件的时候了。开发 APP 避免不了使用「推送」功能。比如,新上架一个商品,或者最新的一条体育新闻,实时推送给用户。 比较了几家推送平台,貌似「极光」出了 Flutter 插件,所以就拿它试试手,顺便…

【C++】多线程与异步编程【四】
文章目录【C】多线程与异步编程【四】0.三问1.什么是异步编程?1.1同步与异步1.2 **阻塞与非阻塞**2、如何使用异步编程2.1 使用全局变量与条件变量传递结果实例1:2.2 使用promise与future传递结果实例2实例32.3使用packaged_task与future传递结果实例42.…

[LintCode] Maximum Subarray 最大子数组
Given an array of integers, find a contiguous subarray which has the largest sum. Notice The subarray should contain at least one number. Have you met this question in a real interview? YesExample Given the array [−2,2,−3,4,−1,2,1,−5,3], the contiguo…

图像补运算:反色处理
cv::Mat inverseColor1(cv::Mat srcImage) {cv::Mat tempImage srcImage.clone();int row tempImage.rows;int col tempImage.cols;// 对各个像素点遍历进行取反for (int i 0; i < row; i){for (int j 0; j < col; j){// 分别对各个通道进行反色处理tempImage.at<…

2018-2019-2 网络对抗技术 20165239Exp3 免杀原理与实践
2018-2019-2 网络对抗技术 20165239 Exp3 免杀原理与实践 win10 ip地址 192.168.18.1 fenix ip地址为 192.168.18.128 (1)杀软是如何检测出恶意代码的? •根据计算机病毒课程知道了每个病毒都有其对应的特征码,杀软是根据这些特征…

【C++】多线程与原子操作和无锁编程【五】
【C】多线程与原子操作和无锁编程【五】 1、何为原子操作 前面介绍了多线程间是通过互斥锁与条件变量来保证共享数据的同步的,互斥锁主要是针对过程加锁来实现对共享资源的排他性访问。很多时候,对共享资源的访问主要是对某一数据结构的读写操作&#…

jquery中ajax的dataType属性包括哪几项
参考ajax api文档:http://www.w3school.com.cn/jquery/ajax_ajax.asp dataType类型:String预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML。在 1.4 中&a…

图像补运算:ptr反色处理
cv::Mat inverseColor3(cv::Mat srcImage) {cv::Mat tempImage srcImage.clone();int row tempImage.rows;// 将3通道转换为单通道int nStep tempImage.cols * tempImage.channels();for(int i 0; i < row; i) {// 取源图像的指针const uchar* pSrcData srcImage.ptr&l…

Android 在运行时请求权限
2019独角兽企业重金招聘Python工程师标准>>> 从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。此方法可以简化应用安装过程,因为用户在安装或更新应用时不需要…

Markdown解决图片存储问题
文章目录Markdown1.前言2.图片引用方式方式1:可以任意比例放缩图片方式2:原比例引用图片3.推荐公式编辑器4.此外简单介绍下Markdown的一种轻量化工具Typora的使用方法。Markdown 1.前言 相信大家在使用Typora,经常会遇到图片编辑的问题&…

jenkins添加git源码目录时报Error performing command错误
简介 这是我在构建一个自动化部署项目中遇到的一个异常 解决步骤: 1、进入的jenkins的home目录,执行下面命令生成公钥和私钥 [rootjacky .jenkins]# ssh-keygen -t dsa 2、查看生成的公钥 [rootjacky .ssh]# cat /root/.ssh/id_dsa.pub ssh-dss AAAAB3Nz…

图像补运算:MatIterator_迭代器反色处理
#include <opencv2/opencv.hpp>#include <opencv2/video/background_segm.hpp>// 注意srcImage为3通道的彩色图片 cv::Mat inverseColor4(cv::Mat &srcImage) {cv::Mat tempImage srcImage.clone();// 初始化源图像迭代器 cv::MatConstIterator_<cv::Vec3…

浅谈同一家公司多个系统,共用登录用户名和密码
主要解决系统使用的加密方式不一致的问题, 比如几年前的系统A, 某某牵头无中生有的系统B 原先A用的php语言开发,比如叫做tap,是国外用来做项目管理的一款BS平台,(和国内发禅道类似,省略***&…

Eigen/Matlab 使用小结
文章目录[Eigen Matlab使用小结](https://www.cnblogs.com/rainbow70626/p/8819119.html)Eigen初始化0.[官网资料](http://eigen.tuxfamily.org/index.php?titleMain_Page)1. Eigen Matlab矩阵定义2. Eigen Matlab基础使用3. Eigen Matlab特殊矩阵生成4. Eigen Matlab矩阵分块…

GitHUb 代码提交遇到的问题以及解决办法
git 添加代码出现以下错误: fatal: Unable to create F:/wamp/www/ThinkPhpStudy/.git/index.lock: File exists. If no other git process is currently running, this probably means a git process crashed in this repository earlier. Make sure no other git …

isContinuous 反色处理
cv::Mat inverseColor5(cv::Mat srcImage) {int row srcImage.rows;int col srcImage.cols;cv::Mat tempImage srcImage.clone();// 判断是否是连续图像,即是否有像素填充if( srcImage.isContinuous() && tempImage.isContinuous() ){row 1;// 按照行展…

阿里云智能对话分析服务
2019独角兽企业重金招聘Python工程师标准>>> 关于智能对话分析服务 智能对话分析服务 (Smart Conversation Analysis) 依托于阿里云语音识别和自然语言分析技术,为企业用户提供智能的对话分析服务,支持语音和文本数据的接入。可用于电话/在线…

【Smooth】非线性优化
文章目录非线性优化0 .case实战0.1求解思路0.2 g2o求解1. 状态估计问题1.1 最大后验与最大似然1.2 最小二乘的引出2. 非线性最小二乘2.1 一阶和二阶梯度法2.2 高斯牛顿法2.2 列文伯格-马夸尔特方法(阻尼牛顿法)3 Ceres库的使用4 g2o库的使用非线性优化 0 .case实战…

.net 基于Jenkins的自动构建系统开发
先让我给描述一下怎么叫一个自动构建或者说是持续集成 : 就拿一个B/S系统的合作开发来说,在用SVN版本控制的情况下,每个人完成自己代码的编写,阶段性提交代码,然后测试-修改,最后到所有代码完工,…

LUT 查表反色处理
cv::Mat inverseColor6(cv::Mat srcImage) {int row srcImage.rows;int col srcImage.cols;cv::Mat tempImage srcImage.clone();// 建立LUT 反色tableuchar LutTable[256];for (int i 0; i < 256; i)LutTable[i] 255 - i;cv::Mat lookUpTable(1, 256, CV_8U);uchar* p…

个人怎么发表期刊具体细节
目前在国内期刊发表,似乎已经成为非常普遍的一种现象,当然普通期刊发表的人数是比较多的,但是同样也有很多人选择核心期刊进行发表在众多期刊当中核心期刊,绝对是比较高级的刊物。很多人都想了解个人怎么发表期刊,那么…

【Math】P=NP问题
文章目录**P vs NP****0 PNP基本定义**0.1 Definition of NP-Completeness0.2 NP-Complete Problems0.3 NP-Hard Problems0.4 TSP is NP-Complete0.5 Proof**1 PNP问题****2 千禧年世纪难题****3 P类和NP类问题特征****4 多项式时间****5 现实中的NP类问题****6 大突破之NPC问题…
窥探react事件
写在前面 本文源于本人在学习react过程中遇到的一个问题;本文内容为本人的一些的理解,如有不对的地方,还请大家指出来。本文是讲react的事件,不是介绍其api,而是猜想一下react合成事件的实现方式 遇到的问题 class Eve…

Python内置方法
一、常用的内置方法 1、__new__ 和 __init__: __new__ 构造方法 、__init__初始化函数1、__new__方法是真正的类构造方法,用于产生实例化对象(空属性)。重写__new__方法可以控制对象的产 生过程。也就是说会通过继承object的new方…

【OpenCV 】Sobel 导数/Laplace 算子/Canny 边缘检测
canny边缘检测见OpenCV 【七】————边缘提取算子(图像边缘提取)——canny算法的原理及实现 1 Sobel 导数 1.1.1 原因 上面两节我们已经学习了卷积操作。一个最重要的卷积运算就是导数的计算(或者近似计算). 为什么对图像进行求导是重要的呢? 假设我…

RGB 转 HSV
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> int main() {// 图像源读取及判断cv::Mat srcImage cv::imread("22.jpg");if (!srcImage.data) …

2017.1.9版给信息源新增:max_len、max_db字段
2017.1.8a版程序给信息源增加max_len、max_db字段,分别用于控制:获取条数、数据库保留条数。 max_len的说明见此图: max_db的说明见此图: 当max_len和max_db的设置不合理时(比如max_len大于max_db,会导致反…

索引使用的几个原则
索引的使用尽量满足以下几个原则: 全值匹配最左前缀不在索引列上做任何操作(包括但不限于,计算,函数,类型转换),会导致对应列索引失效。不适用索引中范围条件右边的列尽量使用覆盖索引使用不等于或者not in 的时候回变…

【OpenCV 】Remapping 重映射¶
目录 1.1目标 1.2 理论 1.3 代码 1.4 运行结果 1.1目标 展示如何使用OpenCV函数 remap 来实现简单重映射. 1.2 理论 把一个图像中一个位置的像素放置到另一个图片指定位置的过程. 为了完成映射过程, 有必要获得一些插值为非整数像素坐标,因为源图像与目标图像的像素坐标…