opencv 读取显示图像 访问像素

#include<opencv.hpp>
#include <iostream>
using namespace cv;
int main()
{   
    //新建一个100 * 100 的图像,CV_8UC3:类型为8位无符号,通道数为3,分别是蓝绿红通道,
    //颜色bgr为255,0,0,蓝通道0xff(8位图像最大位0xFF) ,绿红为0
    cv::Mat blue = cv::Mat(100, 100, CV_8UC3, cv::Scalar(255, 0, 0));
    //新建一个窗口,标题为title
    cv::namedWindow("title", cv::WINDOW_KEEPRATIO);
    //往标题为title的窗口中填充图像,若无此窗口,则自动创建
    cv::imshow("title", blue);

    //读文件 注意反斜杠方向
    cv::Mat src = imread("C:/Users/FeboReigns/Desktop/CachedImage_1024_768_POS4.jpg");
   //打印基本信息 大小 通道数 类型,注意类型是宏定义,要去查数字对应是哪个类型
   // 这是宏定义 我复制过来了一部分
//#define CV_8U   0
//#define CV_8S   1
//#define CV_16U  2
//#define CV_16S  3
//#define CV_32S  4
//#define CV_32F  5
//#define CV_64F  6
//#define CV_16F  7
    std::cout << "\n" << "size:" << src.size() << " channels:" << src.channels()
        << " type:" << src.type()
        << "\n";

    //初始化一个矩阵,大小为blue的列数和行数,CV_8UC1 类型为8位无符号,通道数为1
    //zeros 所有数据填充位0,除此之外还有ones,所有数据填充为1
    Mat gray = Mat::zeros(Size(blue.cols, blue.rows), CV_8UC1);
    //小功能1 彩色转灰度
    //转换色彩空间将src 转为灰度图
    cvtColor(src, gray, COLOR_BGR2GRAY);

    cv::namedWindow("gray", cv::WINDOW_KEEPRATIO);
    cv::imshow("gray", gray);
    //获取图像的宽高
    int cols = gray.cols;
    int rows = gray.rows;
    
    Mat white = Mat::zeros(Size(cols, rows), CV_8UC1);
    //小功能2 简单的加法,提高亮度
    for (int i = 0; i < rows; i++) {
       //第i行的首地址,即第i行的第一个像素 
        uchar * row_gray = gray.ptr(i);

        uchar* row_white = white.ptr(i);

        for (int j = 0; j < cols; j++) {
            //第j列,即第i行的第j个像素
            //+10 对黑白图来说,亮度会增加
            if(row_gray[j] + 10<=255)
                row_white[j] = row_gray[j]+10;
        }
    }
    cv::namedWindow("white", cv::WINDOW_KEEPRATIO);
    cv::imshow("white", white);
    //小功能3 图像格式转换 归一化,颜色变暗
    Mat white_fide;
    //归一化到 0 到 1 图像内容变为为零点几,类型也变为了CV_32FC1,单通道32位float
    normalize(white, white, 0, 1, NORM_MINMAX,CV_32FC1);

    //white_fide = white* 0.8 + 0*0 + 0.02
    addWeighted(white, 0.8, Mat::zeros(Size(cols, rows), CV_32FC1), 0, 0.02,white_fide);
    cv::namedWindow("white_fide", cv::WINDOW_KEEPRATIO);
    cv::imshow("white_fide", white_fide);
    
    //小功能4 得到某段程序运行时间
    auto start = clock(); //记录此时时钟
        //拷贝一份内存给out
        Mat out = white_fide.clone();
    auto end = clock();//记录此时时钟
    auto time = end - start;//时钟差即为 消耗的时间 毫秒
    //注意 Debug的速度要比Relase 慢很多
    std::cout << time<<std::endl;
    //图像保存
    imwrite("out.jpg", out);


    //每隔多少毫秒,等待按键按下,阻塞程序不能往下执行,当参数为0 则一直等待,一直阻塞
    //若不阻塞则程序退出,imshow的图像一瞬即逝
    cv::waitKey(0);
    
}

 time 为2

注意

我上面写的是单通道的访问像素点

若为多通道则应这样写

//读文件 注意反斜杠方向
    cv::Mat src = imread("C:/Users/FeboReigns/Desktop/CachedImage_1024_768_POS4.jpg");
    cv::namedWindow("src", cv::WINDOW_KEEPRATIO);
    cv::imshow("src", src);

    for (int i = 0; i < src.rows; i++) {
        //第i行的首地址,即第i行的第一个像素 
        uchar* row_src = src.ptr(i);

        for (int j = 0; j < src.cols*3; j+=3) {
            //第j列,即第i行的第j个像素
            //对于三通道来说,j列有三个值,分别为B 分量 G分量 R分量
            //我这里对每个分量加不同的值 蓝绿减弱,红色增强

            if (row_src[j+0] - 20 >= 0)
                row_src[j + 0] = row_src[j + 0] - 20;

            if (row_src[j + 1] - 20 >= 0)
                row_src[j + 1] = row_src[j + 1] - 20;
            
            if (row_src[j + 2] + 30 <= 255)
                row_src[j + 2] = row_src[j + 2] + 30;
        }
    }
    cv::namedWindow("src_1", cv::WINDOW_KEEPRATIO);
    cv::imshow("src_1", src);

 

 opencv VS 环境搭建 读取显示图像 访问像素_FeboReigns的博客-CSDN博客C++图像处理入门 平面图 交织图 存储方式_FeboReigns的博客-CSDN博客

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值