Opencv学习笔记

来源:互联网 发布:禅道linux一键安装包 编辑:程序博客网 时间:2024/06/04 18:36

一、图像反色


用255减去每个像素值,得到一个心图像,这里使用迭代器和LUT(look up table )两种方法。

1.用迭代器

#include <highgui.h>  using namespace std ;  using namespace cv ;  int main(int argc,char ** argv)  {      Mat image = imread(argv[1],1) ;      imshow("image" , image) ;  cv::Mat tempImage = image.clone();        // 初始化源图像迭代器        cv::MatConstIterator_<cv::Vec3b> srcIterStart  = image.begin<cv::Vec3b>();        cv::MatConstIterator_<cv::Vec3b> srcIterEnd = image.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++;        }  imshow("outputimage",tempImage);    waitKey(0) ;      return 0 ;  }  


2.用LUT 

该函数可进行图像像素查找,扫描,操作


#include <highgui.h>  using namespace std ;  using namespace cv ;  int main(int argc,char ** argv)  {      Mat image = imread(argv[1],1) ;      imshow("image" , image) ;      int row = image.rows;        int col = image.cols;        cv::Mat tempImage = image.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(image, lookUpTable, tempImage);      imshow("outputimage",tempImage);    waitKey(0) ;      return 0 ;  }  

结果如下:


二、图像平移

代码:

#include<opencv2/core/core.hpp>  #include<opencv2/highgui/highgui.hpp>  using namespace cv;  //平移后大小不变  void translateTransform(cv::Mat const& src, cv::Mat& dst, int dx, int dy)  {      CV_Assert(src.depth() == CV_8U);      const int rows = src.rows;      const int cols = src.cols;      dst.create(rows, cols, src.type());      Vec3b *p;      for (int i = 0; i < rows; i++)      {          p = dst.ptr<Vec3b>(i);          for (int j = 0; j < cols; j++)          {              //平移后坐标映射到原图像              int x = j - dx;              int y = i - dy;              //保证映射后的坐标在原图像范围内              if (x >= 0 && y >= 0 && x < cols && y < rows)                  p[j] = src.ptr<Vec3b>(y)[x];          }      }  }  //平移后大小变化  void translateTransformSize(cv::Mat const& src, cv::Mat& dst, int dx, int dy)  {      CV_Assert(src.depth() == CV_8U);      const int rows = src.rows + abs(dy); //输出图像的大小      const int cols = src.cols + abs(dx);      dst.create(rows, cols, src.type());      Vec3b *p;      for (int i = 0; i < rows; i++)      {          p = dst.ptr<Vec3b>(i);          for (int j = 0; j < cols; j++)          {              int x = j - dx;              int y = i - dy;              if (x >= 0 && y >= 0 && x < src.cols && y < src.rows)                  p[j] = src.ptr<Vec3b>(y)[x];          }      }  }  int main(int argc,char** argv)  {      Mat srcimage,dst,dst1;      srcimage=imread(argv[1],1);      namedWindow("src_window");      imshow("src_window",srcimage);      translateTransform(srcimage, dst,50, 50);      namedWindow("dst_window");      imshow("dst_window",dst);     translateTransformSize(srcimage,dst1, 50, 50);      namedWindow("dst_window1");      imshow("dst_window1",dst1);      waitKey(0);  }  

1.大小不变的平移 结果显示如下



2.图像大小变化平移 结果如下






0 0
原创粉丝点击