OpenCV图像像素操作及效率分析

        学习OpenCV也几个月了,虽然对OpenCV有些了解,但是感觉基础还是没打实,在这在介绍一下OpenCV的像素操作,以及OpenCV读取图像的格式和读取图像的效率分析。当然文章也有很多没有介绍到的地方,希望大家多多指教,相互交流。

        在计算机视觉应用中,对于图像内容的读取分析是第一步,所以学习高效的处理图像是很有用的。一个图像有可能包含数以万计的像素,从根本上说图像就是一系列像素值,所以OpenCV使用数据结构cv::Mat来表示图像。矩阵中每一个元素都代表一个像素,对于灰度图像,像素用8位无符号数,0表示黑色,255表示白色。对于彩色像素而言,每个像素需要三位这样的8位无符号数来表示,即三个通道(R,G,B),矩阵则依次存储一个像素的三个通道的值,然后再存储下一个像素点。

       cv::Mat中,成员变量cols代表图像的宽度(图像的列数),成员变量rows代表图像的高度(图像的行数),step代表以字节为单位的图像的有效宽度,elemSize返回像素的大小,像素的大小 = 颜色大小(字节)*通道数,比如三通道short型矩阵(CV_16SC3)的大小为2*3 = 6,像素的channels方法返回图像的通道数,total函数返回图像的像素数。

       闲话少说直接介绍几种读取方式:

       RGB图像的颜色数目是256*256*256,本文对图像进行量化,缩减颜色数目到256的1/8(即32*32*32)为目标,分别利用一下几种方法实现,比较几种方法的安全和效率。

       1.ptr遍历图像

       cv::Mat中提供ptr函数访问任意一行像素的首地址,特别方便图像的一行一行的横向访问,如果需要一列一列的纵向访问图像,就稍微麻烦一点。但是ptr访问效率比较高,程序也比较安全,有越界判断。

      int nl= image.rows; //行数
      int nc= image.cols * image.channels(); // 每行的元素个数,每行的像素数*颜色通道数(RGB = 3)
              
      for (int j=0; j<nl; j++) {
          uchar* data= image.ptr<uchar>(j);
          for (int i=0; i<nc; i++) { 
            // process each pixel ---------------------              
               data[i]= data[i]/div*div + div/2;
            // end of pixel processing ----------------
          } // end of line                   
      }
     也可以使用:

   
  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值