图像遍历反色处理,遍历多通道图片
2016-11-18 20:05
176 查看
#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 反色table uchar 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-1 double 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-2 tTime = (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; // 测试方法2 tTime = (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; // 测试方法3 tTime = (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; // 测试方法4 tTime = (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; // 测试方法5 tTime = (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
相关文章推荐
- 基于mfc数字图像处理的小软件pdd-转换图片成RGB通道,反色,黑白,灰度图片
- 用python简单处理图片(2):图像通道\几何变换\裁剪
- python 图像预处理--统一修改图片大小并使图片反色
- 用python简单处理图片(2):图像通道\几何变换\裁剪
- 用python简单处理图片(2):图像通道\几何变换\裁剪
- 用python简单处理图片(2):图像通道\几何变换\裁剪
- 用python简单处理图片(2):图像通道\几何变换\裁剪
- c#图像处理、图片拼接、图片裁剪、图片缩放、图上添加形状、屏幕截图、图片反色、改变图片色彩度全解
- 图像及动画处理一:图片切割
- iOS开发图像处理--绘制图片上下颠倒
- SWT图片处理(大小缩放,透明,置灰,旋转,反色)
- 图像处理基础(四)_图像分辨率、图像模式及通道讲解
- opencv图像处理2--打开图片并显示
- 分享的是Android图像特效处理的小技巧,比如圆角、倒影、还有就是图片缩放、Drawable转化为Bitmap、Bitmap转化为Drawable等等
- C# 图像处理(五)—— 图片翻转
- QT图像类的选择与处理(数码相框优化图片显示)
- 彩色图片变灰色,图片亮度变暗变亮--图像处理之二
- 【Matlab图像处理】学习笔记:读取16进制RGB文档转为彩色图片
- 图像处理算法(模糊,锐化,水彩,素描,反色,马塞克,灰度转化等)
- VC6.0图像处理1--浏览图片