zoukankan      html  css  js  c++  java
  • 高效遍历图像

    如何遍历一副图像?最简单的方法就是写个双层循环,增量分别为行和列,但是如何高效遍历一副图像?

    核心思想就两点:①减少双重循环中外层循环的次数②对图像处理过程中,| & 比普通运算效率高。

    在一副彩色图像中,计算机是以二维数组的形式来存储,数组中每个元素是一个包含三个元素的向量,通常是BGR(或者RGB)。所以一个宽度为W,高度为H的图像需要一个大小为W*H*3的uchar构成的内存块。但是出于性能的考虑,每行会填补一些额外的像素,这是因为,如果行的长度是4或者8的倍数,一些多媒体处理芯片可以更高效的处理图像,这些额外的像素不会被显示或者保存,填补的值将被忽略。

     1 void colorReduce(cv::Mat& image, int div=64)
     2 {
     3     int nl = image.rows(); // 行数
     4     int nc = image.cols(); // 列数
     5     if (image.isContinuous())
     6     {
     7         // 没有对像素进行填补
     8         nc *= nl;
     9         nl = 1;
    10     }
    11     int n = static_cast<int>(log(static_cast<double>(div))/log(2.0));
    12     // 用来对像素值进行取整的二进制掩码
    13     uchar mask = 0xff << n;
    14     // for all pixels
    15     for (int i = 0; i < nl; ++i)
    16     {
    17         uchar* data = image.ptr<uchar>(i);
    18         for (int j = 0; j < nc; ++j)
    19         {
    20             // 处理每个像素
    21             *data++ = *data&mask + div/2;
    22             *data++ = *data&mask + div/2;
    23             *data++ = *data&mask + div/2;
    24         }
    25     }
    26 
    27 }
  • 相关阅读:
    博客地址
    node学习2
    正则表达式总结
    Git命令操作
    IDEA快捷键
    hibernate多对多(权限管理)
    所有国家的下拉框英文全称
    所有国家的下拉框英文简写
    所有国家的下拉框中文
    poj-1248 Safecracker
  • 原文地址:https://www.cnblogs.com/lniwn/p/3400993.html
Copyright © 2011-2022 走看看