• OpenCV——颜色缩减、计时函数、访问像素


     1 //颜色空间缩减
     2 //src:源图片
     3 //dst:目标图片
     4 //divideWith:缩减宽度
     5 void ColorSpaceReduction(Mat src,int divideWith,Mat& dst)
     6 {
     7     //创建查询用的表
     8     uchar table[256];
     9     for (int i = 0; i < 256; ++i)
    10         table[i] = divideWith * (i / divideWith);
    11     //创建mat型用于LUT函数查表
    12     Mat lookUpTable(1, 256, CV_8U);
    13     uchar* p = lookUpTable.data;
    14     for (int i = 0; i < 256; ++i)
    15         p[i] = table[i];
    16     //src是输入dst是输出
    17     LUT(src, lookUpTable, dst);
    18 
    19 }

    1 double time0 = static_cast<double>(getTickCount());//记录起始时间
    2 
    3 time0 = ((double)getTickCount() - time0) / getTickFrequency();
    4 cout << "运行时间为 "<< time0 << ""<<endl;//输出运行时间

    访问像素的三种方法

    【方法1】指针访问,c语言操作符[ ](速度最快,但有越界的风险)

     1     int rowNumber = dst.rows;//行数
     2     int colNumber = dst.cols*dst.channels();//列数*通道数=每一行的元素个数
     3 
     4     //循环遍历每个元素
     5     for (int i = 0; i < rowNumber; i++)//行循环
     6     {
     7         uchar* data = dst.ptr<uchar>(i);//获取第i行首地址
     8         for (int j=0; j < colNumber; j++)//列循环
     9             data[j] = data[j] / div* div+div/2;//颜色缩减操作
        //也可以写成 *data++=*data/div*div+div/2;
    10 }

    【方法2】迭代器iterator(绝对安全,不会越界)

    1     Mat_<Vec3b>::iterator it = dst.begin<Vec3b>();//初始位置的迭代器
    2     Mat_<Vec3b>::iterator itend = dst.end<Vec3b>();//终止位置的迭代器
    3     //彩色图像每个像素有3个通道
    4     for (; it != itend; ++it)
    5     {
    6         (*it)[0] = (*it)[0] / div * div + div / 2;
    7         (*it)[1] = (*it)[1] / div * div + div / 2;
    8         (*it)[2] = (*it)[2] / div * div + div / 2;
    9     }

    【方法1】动态地址计算(最慢)

     1     int rowNumber = dst.rows;//行数
     2     int colNumber = dst.cols;//列数
     3     for (int i = 0; i < rowNumber; i++)
     4     {
     5         for (int j = 0; j < colNumber; j++)
     6         {
     7             //彩色图像每个像素有3个通道
     8             dst.at<Vec3b>(i, j)[0] = dst.at<Vec3b>(i, j)[0] / div * div + div / 2;
     9             dst.at<Vec3b>(i, j)[1] = dst.at<Vec3b>(i, j)[1] / div * div + div / 2;
    10             dst.at<Vec3b>(i, j)[2] = dst.at<Vec3b>(i, j)[2] / div * div + div / 2;
    11         
    12         }
    13     }

  • 相关阅读:
    Redis环境搭建(整合SprinigBoot一键切换集群和单机环境)
    Docker + SpringBoot2.0快速构建镜像
    kafka实现分布式事务
    【本地事物】
    【数据结构之二叉树】
    变量
    python 介绍
    编程语言的区别
    路飞学城python教程 第二章练习题
    windows下nginx配合ffmpeg推送视频流
  • 原文地址:https://www.cnblogs.com/long5683/p/9651442.html
Copyright © 2020-2023  润新知