系统学习图像算法Day.7——OpenCV学习——访问图像像素、设置ROI、图像混合、分离及合并颜色通道、调整对比度及亮度、DFT傅里叶变换、XML及YAML文件

访问图像的像素

本节内容通过一个实际的案例(颜色压缩)来说明访问图像像素的3种方法——颜色压缩的原理是data[j] = data[j]/div*div ,利用了char类型运算时的向下取整。

通过指针访问像素

 for(int i = 0;i < rowNumber;i++)  //行循环
 {  
      uchar* data = outputImage.ptr<uchar>(i);  //获取outputImage第i行的首地址
      for(int j = 0;j < colNumber;j++)   //列循环
       {   
                      data[j] = data[j]/div*div + div/2;  
        } 
 }  

用迭代器操作像素

 Mat_<Vec3b>::iterator it = outputImage.begin<Vec3b>();  //初始位置的迭代器
 Mat_<Vec3b>::iterator itend = outputImage.end<Vec3b>();  //终止位置的迭代器
 //存取彩色图像像素
 for(;it != itend;++it)  
 {  
  // ------------------------【开始处理每个像素】--------------------
  (*it)[0] = (*it)[0]/div*div + div/2;  
  (*it)[1] = (*it)[1]/div*div + div/2;  
  (*it)[2] = (*it)[2]/div*div + div/2;  
  // ------------------------【处理结束】----------------------------
 }  

动态地址计算

 int rowNumber = outputImage.rows;  //行数
 int colNumber = outputImage.cols;  //列数
  //存取彩色图像像素
 for(int i = 0;i < rowNumber;i++)  
 {  
         for(int j = 0;j < colNumber;j++)  
         {   
              // ------------------------【开始处理每个像素】--------------------
             outputImage.at<Vec3b>(i,j)[0] =  outputImage.at<Vec3b>(i,j)[0]/div*div + div/2;  //蓝色通道
             outputImage.at<Vec3b>(i,j)[1] =  outputImage.at<Vec3b>(i,j)[1]/div*div + div/2;  //绿色通道
             outputImage.at<Vec3b>(i,j)[2] =  outputImage.at<Vec3b>(i,j)[2]/div*div + div/2;  //红是通道
             // -------------------------【处理结束】----------------------------
          }  // 行处理结束     
 }  

图像的ROI设置

定义ROI有2种方法

使用表示矩形区域的Rect

 Mat imageROI;
 imageROI = image( Rect(500, 250, logo.cols, logo.rows) );   // 左上角坐标、矩形的长和宽

指定感兴趣行或列的范围Range

imageROI = image( Range(250, 250+logoImage,rows) , Range(200, 200+logoImage,cols) );   //

线性混合操作

利用 addWeighted() 函数
addWeighted(A, a, B, b, 0.0, C);
//其中A、B表示数组或者图像,a、b分别是它们混合所占权重,a+b=1, C为混合后的图像。

颜色通道的分离及混合

主要是 splitmerge 两个函数的使用

分离图片的颜色通道

split( A, B) //其中A表示Mat类或者InputArray类型, B表示vector向量容器或者OutputArrays类型

举例:
vector<Mat> channels;
Mat imageBlueChannel;
Mat imageGreenChannel;
Mat imageRedChannel;

split( srcImage, channels);
imageBlueChannel = channels.at(0);
imageGreenChannel = channels.at(0);
imageRedChannel = channels.at(0);

merge(B, A); 其实就和split相反

merge( channels, srcImage);

调整图像对比度及亮度

本质公式: g(x)= a*f(x) + b
参数f(x) 表示源图像像素
参数g(x) 表示输出图像像素
参数a 称为增益,控制对比度
参数b 称为偏置,控制亮度

DFT傅里叶变换、XML及YAML文件

没咋看明白,日后再补充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值