目录

一、读取图像与新建图像

1、读取图像

2、新建图像

二、显示图像

1、过程

2、代码

3、运行效果

三、操作图像像素

1、逐RGB涂色(单循环)(快)

1-1、过程

2-2、代码

2-3、运行结果

2、逐行涂色(双循环)(慢)

3、算法快慢比较

总代码


一、读取图像与新建图像

注:如果是添加新图(非读取),必须要新建图像,否则会报错(没有初值)。 

总而言之,图像必须有初值,这个初值要么读取获得,要么新建获得。

1、读取图像

img = imread("Resource/test.jpg");

2、新建图像

dst = Mat::zeros(img.size(), img.type());

分别需要填入图片大小图片类型 。

二、显示图像

1、过程

1、打开图像;

2、新建窗口

3、在窗口中显示图像

2、代码

//显示图像
#include <iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;int main()
{//1、打开图像Mat img = imread("Resource/test.png");//图像为空if (img.empty())cout << "can not find the image!\n";//设置窗口(可以不要)namedWindow("图像", WINDOW_AUTOSIZE);     //新建一个显示窗口,命名并指定窗口的类型(这里为固定)//                                         WINDOW_NORMAL       //可调控//2、在窗口中显示imshow("图像", img);waitKey(0);              //等待
}

3、运行效果

三、操作图像像素

三通道RGB):

1、逐RGB涂色(单循环)(快)

1-1、过程

指针指向首元素地址

//获取矩阵数据的起始地址
uchar* p = image.ptr<uchar>(0);
//图像的指针用法举例
cv::Mat image = cv::Mat(400, 600, CV_8UC1);    //定义了一个Mat变量image。
uchar * data00 = image.ptr<uchar>(0);          //data00是指向image第1行第1个元素的指针。
uchar * data10 = image.ptr<uchar>(1);          //data10是指向image第1行第1个元素的指针。
uchar * data01 = image.ptr<uchar>(0)[1];       //data01是指向image第1行第2个元素的指针。

一共运行length次,lengthrgb总数

//总RGB个数int length = image.cols * image.rows * image.channels();//总RGB个数 = 行数*列数*通道数     (总像素=行数*列数    转化为RGB->乘RGB数量(即通道数)//三通道:RGB

2-2、代码

//逐RGB涂色(单循环)
void setAllWhite(Mat& image)
{int i;//总RGB个数int length = image.cols * image.rows * image.channels();//总RGB个数 = 行数 * 列数 * 通道数                   (总像素=行数*列数      转化为RGB->乘RGB数量(即通道数)//三通道:RGB//获取矩阵数据的起始地址uchar* p = image.ptr<uchar>(0);///逐rgb涂色for (i = 0; i < length; i++){//data[i] = 150;               (*p++) = 150;                //涂色(逐RGB)}
}

2-3、运行结果

2、逐行涂色(双循环)(慢)

(同上)指针指向首元素地址

//获取矩阵数据的起始地址
uchar* p = image.ptr<uchar>(0);
//图像的指针用法举例
cv::Mat image = cv::Mat(400, 600, CV_8UC1);    //定义了一个Mat变量image。
uchar * data00 = image.ptr<uchar>(0);          //data00是指向image第1行第1个元素的指针。
uchar * data10 = image.ptr<uchar>(1);          //data10是指向image第1行第1个元素的指针。
uchar * data01 = image.ptr<uchar>(0)[1];       //data01是指向image第1行第2个元素的指针。

逐行 涂色image.rows,再在循环中逐rgb涂色image.cols * image.channels()。

//逐行涂色(双循环)
void setAllWhiteRows(Mat& image)
{int i, j;//获取矩阵数据的起始地址uchar* p = image.ptr<uchar>(0);for (i = 0; i < image.rows; i++)                                     //逐行{for (j = 0; j < image.cols * image.channels(); j++)      //逐rgb{(*p++) = 150;             //涂色(逐RGB)}}
}

3、算法快慢比较

运用时间获取函数colck()开始时计时一次结束时计时一次差值即为算法运行时间。

clock()返回ms,需要获取s,所以除1000

//比较两种算法的运行速度
void compareTime(Mat& image)
{int count = 10;long begin, end;//统计单循环方式(逐像素)运行时间begin = clock();while (count-- > 0)setAllWhite(image);             //运行end = clock();printf("Single loop time is %f .\n", (double)(end - begin) / (double)CLOCKS_PER_SEC);//                                                                    clock()以ms计,需要除1000才能获取到s//统计双循环方式(逐行)运行时间count = 10;begin = clock();while (count-- > 0)setAllWhiteRows(image);       //运行end = clock();printf("Double loop time is %f \n", (double)(end - begin) / (double)CLOCKS_PER_SEC);
}

总代码

//图像逐像素的操作
//单循环:逐个对每个像素进行赋值
//双循环:逐行对每个像素进行赋值
#include <iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;//逐RGB涂色(单循环)
void setAllWhite(Mat& image)
{int i;//总RGB个数int length = image.cols * image.rows * image.channels();//总RGB个数 = 行数 * 列数 * 通道数                   (总像素=行数*列数      转化为RGB->乘RGB数量(即通道数)//三通道:RGB//获取矩阵数据的起始地址uchar* p = image.ptr<uchar>(0);///逐rgb涂色for (i = 0; i < length; i++){//data[i] = 150;               (*p++) = 150;                //涂色(逐RGB)}
}//逐行涂色(双循环)
void setAllWhiteRows(Mat& image)
{int i, j;//获取矩阵数据的起始地址uchar* p = image.ptr<uchar>(0);for (i = 0; i < image.rows; i++)                                     //逐行{for (j = 0; j < image.cols * image.channels(); j++)      //逐rgb{(*p++) = 150;             //涂色(逐RGB)}}
}//比较两种算法的运行速度
void compareTime(Mat& image)
{int count = 10;long begin, end;//统计单循环方式(逐像素)运行时间begin = clock();while (count-- > 0)setAllWhite(image);             //运行end = clock();printf("Single loop time is %f .\n", (double)(end - begin) / (double)CLOCKS_PER_SEC);//                                                                    clock()以ms计,需要除1000才能获取到s//统计双循环方式(逐行)运行时间count = 10;begin = clock();while (count-- > 0)setAllWhiteRows(image);       //运行end = clock();printf("Double loop time is %f \n", (double)(end - begin) / (double)CLOCKS_PER_SEC);
}//输出RGB
void Print(Mat& image)
{int i, length;const uchar* p = image.ptr<uchar>(0);     //指向首个指针length = image.rows;                                   //*image.cols       这里只输出一行cout << "\nPrint one row pixels:\n";for (i = 0; i < length; i++){printf("%2d", *p++);}cout << endl;
}int main()
{Mat img = imread("Resource/test.png");          //打开图片if (img.empty()){printf("could not load the image..");return -1;}//显示图像namedWindow("初始图像", WINDOW_AUTOSIZE);imshow("初始图像", img);Print(img);                                 //输出RGB//涂色与算法比较compareTime(img);                       //比较两种算法运行时间//setAllWhite(img);                         //逐RGB涂色//setAllWhiteRows(img);                 //逐行涂色//显示图像namedWindow("涂色图像", WINDOW_AUTOSIZE);imshow("涂色图像", img);Print(img);                                        //输出RGBwaitKey(0);                                      //等待
}

OpenCV(一)图像读取与新建、图像显示、操作图像像素(2种涂色并比较算法优劣、输出RGB)相关推荐

  1. opencv进阶学习笔记2:numpy操作图像,色彩空间,查找指定颜色范围,通道分离与合并

    基础部分传送门 python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录: python+opencv进阶版学习笔记目录(适合有一定基础) Numpy操作图像 1.遍历图像每一 ...

  2. ROS下UVC免驱高速摄像头图像读取以及利用image_transport进行图像传递

    网上可以买到很多高速摄像头模块,常见的就是这个ov2710模组,采用uvc免驱,号称在1080p 30fps,720p 60fps以及VGA 120fps. 值得是注意的是,这些高速模式都是在MJPG ...

  3. python 读取图片成为一维数组_python+opencv 图像的数组和矩阵操作

    在调用opencv的imread函数读取图像时,我们得到的其实是一个类型为numpy.ndarray的n维数组.这个数组的维度是[height,width,3],它是由每个像素的RGB通道的灰度值组成 ...

  4. opencv入门基础——图像读取,图像显示,图像保存

    一,图像读取 如上图所示,从文件中导入图像用这个函数 retval=cv.imread(文件名,[,显示控制参数]) 显示控制参数,主要是这几个: cv.IMREAD_UNCHANGED cv.IMR ...

  5. 【opencv系列02】OpenCV4.X图像读取与显示

    点击上方"AI搞事情"关注我们 一.读取图片 opencv中采用imread() 函数读取图像 imread(filename, flags=None)     filename ...

  6. youcans 的 OpenCV 学习课—2.图像读取与显示

    youcans 的 OpenCV 学习课-2.图像读取与显示 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. 本节介绍图像的读取.保存和显示.除基本方法和例程外,还给出了从 ...

  7. openCV 图像和视频处理基础操作

    openCV 基础操作 A.数据读取-图像 B. 数据读取-视频 C. 截取部分图像数据 D.颜色通道提取 E.边界填充 F.图像融合 G. 图像阈值 H. 图像平滑 openCV 参考相关技术博客和 ...

  8. OpenCV 【十九】图像金字塔/基本的阈值操作/实现自己的线性滤波器

    目录 1.part one 图像金字塔 1.1原理 1.1.1图像金字塔 1.1.2高斯金字塔 1.2代码 1.3运行结果 2.part two 基本的阈值操作¶ 2.1原理 2.1.1阈值化的类型: ...

  9. OpenCV 1.x 2.x 编程简介(矩阵/图像/视频的基本读写操作)

    OpenCV 编程简介(矩阵/图像/视频的基本读写操作) Introduction to programming with OpenCV OpenCV编程简介 作者: Gady Agam Depart ...

最新文章

  1. 广东海洋大学微型计算机考试,广东海洋大学2007-2008微型计算机原理及应用
  2. javascript 的参数有长度限制吗?一个细节引起的误区
  3. simple introduction to AUTOFS
  4. 【Elasticsearch】你看懂 Elasticsearch Log 中的 GC 日志了吗?
  5. aptana 代码折行
  6. ECMAScript5新增Array方法forEach的实现
  7. php h5视频录制上传,基于koa的h5视频录制异步上传
  8. 百练 2965 玛雅历 解题报告
  9. xml建模包括以下_数据挖掘--建模与挖掘的结合
  10. [Linux源码分析]Linux内核架构
  11. [VBA]VBA编写的时光倒流软件
  12. linux从新建命令窗口快捷键,tmux 常用命令及快捷键
  13. CRM客户细分的价值
  14. 霹雳猿教程网站正式上线
  15. labuladong 公众号的使用方法
  16. 揭秘电信“龙计划”:合约手机将执行“四统一”
  17. Mac上php环境配置
  18. Android各种大内存脚本对比(app2sd,a2sd,a2sd+,d2sd,CronMod,Mound2SD)
  19. 【图像去噪】基于最小二乘方滤波实现图像去噪含Matlab源码
  20. 一文读懂 druid连接池

热门文章

  1. 生成器、迭代器的区别?
  2. kvm虚拟机vnc配置
  3. Windows平台搭建-----C语言
  4. HttpUrlConnection底层实现和关于java host绑定ip即时生效的设置及分析
  5. 02---控制移动底座1
  6. mysql 5.7 1054_MySQL5.7更改密码时出现ERROR 1054 (42S22)的解决方法
  7. 算法设计与分析第1章 算法概述
  8. php 英文小写变大写,PHP英文字母大小写转换函数
  9. fedora mysql 客户端_fedora mysql 安装
  10. 方法 注释_注释模板导入操作方法