• Opencv之像素值的获取


      灰度图像${ m{M}} imes { m{N}}$的像素矩阵值为0~255,像素值越大越亮。${{ m{I}}_{{ m{i}}{ m{j}}}}$,i表示行的位置,j 表示列的位置即i行j列。RGB图像在Opencv中内存顺序为:BGR三个通道。

    获取像素的方式有三种:代码如下

     1 #include<opencv2/opencv.hpp>
     2 #include<iostream>
     3 
     4 using namespace std;
     5 using namespace cv;
     6 void point(Mat& inputImage, Mat& result, int div);//指针方式
     7 void iteraton_operate(Mat& inputImage, Mat& result, int div);//迭代器方式
     8 void dynamic_address(Mat& inputImage, Mat& result, int div);//动态地址方式
     9 Mat src, gray, dst;
    10 int main(int argc, char** argv)
    11 {
    12     
    13     src = imread("H:/cv_code/image/home.jpg");
    14     if (src.empty())
    15     {
    16         printf("could not find image");
    17         return -1;
    18     }
    19     namedWindow("input");
    20     imshow("input",src);
    21     cvtColor(src,gray,COLOR_BGR2GRAY);
    22     namedWindow("result");
    23     point(src, dst, 32);
    24     iteraton_operate(src, dst, 32);
    25     dynamic_address(src, dst, 32);
    26     waitKey(0);
    27     return 0;
    28 }
    29 void point(Mat& inputImage, Mat& result, int div)
    30 {
    31     result = inputImage.clone();
    32     int channels = result.channels();
    33     int rows = result.rows;
    34     int cols = result.cols * channels;
    35     for (int i = 0; i < rows; i++)
    36     {
    37         uchar* value = result.ptr<uchar>(i);
    38         for (int j = 0; j < cols; j++)
    39         {
    40             value[j] = value[j] / div * div + div / 2;
    41         }
    42     }
    43 }
    44 void iteraton_operate(Mat& inputImage, Mat& result, int div)
    45 {
    46     result = inputImage.clone();
    47     Mat_<Vec3b>::iterator itbegin = result.begin<Vec3b>();
    48     Mat_<Vec3b>::iterator itend = result.end<Vec3b>();
    49     for (;itbegin !=itend;++itbegin)
    50     {
    51         (*itbegin)[0] = (*itbegin)[0] / div * div + div / 2;
    52         (*itbegin)[1] = (*itbegin)[1] / div * div + div / 2;
    53         (*itbegin)[2] = (*itbegin)[2] / div * div + div / 2;
    54 
    55     }
    56 
    57 }
    58 void dynamic_address(Mat& inputImage, Mat& result, int div)
    59 {
    60     result = inputImage.clone();
    61     int rows = result.rows;
    62     int cols = result.cols;
    63     for (int i = 0; i < rows; i++)
    64     {
    65         
    66         for (int j = 0; j < cols; j++)
    67         {
    68             result.at<Vec3b>(i, j)[0] = result.at<Vec3b>(i, j)[0] / div * div + div / 2;
    69             result.at<Vec3b>(i, j)[1] = result.at<Vec3b>(i, j)[1] / div * div + div / 2;
    70             result.at<Vec3b>(i, j)[2] = result.at<Vec3b>(i, j)[2] / div * div + div / 2;
    71         }
    72     }
    73 }
  • 相关阅读:
    C# WinForm界面上实现按条件检索数据
    DevExpress中XtraEditors.RadioGroup 控件如何保存获取选中的值及读取数据库中的值
    在QTP Test中利用vbs和cmd实现重新启动QTP
    VBS操作Excel的一点问题总结
    利用vbs维护qtp的虚拟对象的坐标
    Smoke Test和BVT Test的区别
    小结一下VS2012新开发环境的设置经历
    关闭EF4.x Code First的级联删除Cascade Delete
    关于Entity Framework 4.0/4.1数据验证的一点体会
    CentOS 6.3 Minimal yum 安装 PostgreSQL 9.2.3
  • 原文地址:https://www.cnblogs.com/fuzhuoxin/p/12060911.html
Copyright © 2020-2023  润新知