C++之OpenCV入门到提高005:005 图像操作
一、介绍
今天是这个系列《C++之 Opencv 入门到提高》得第五篇文章。这篇文章也不难,介绍如何图像的基本操作,比如:读取一张图片的像素值,如何修改一张图片中的像素值,如何读取一张图片,如何保存一张图片等等,这都是基础,为以后的学习做好铺垫。虽然操作很简单,但是背后有很多东西需要我们深究,才能做到知其然知其所以然。OpenCV 具体的简介内容,我就不多说了,网上很多,大家可以自行脑补。
OpenCV 的官网地址:https://opencv.org/,组件下载地址:https://opencv.org/releases/。
OpenCV 官网学习网站:https://docs.opencv.ac.cn/4.10.0/index.html
我需要进行说明,以防大家不清楚,具体情况我已经罗列出来。
操作系统:Windows Professional 10(64位)
开发组件:OpenCV – 4.10.0
开发工具:Microsoft Visual Studio Community 2022 (64 位) - Current版本 17.8.3
开发语言:C++(VC16)
二、知识学习
这些都是图像的基本操作,所以并不会很难,但是这也是学好 openCV的基础。内容很简单,就不说过多的废话了,所有讲解都在代码的注释中。
1 #include <opencv2/opencv.hpp>
2 #include <iostream>
3 #include <math.h>
4
5 using namespace std;
6 using namespace cv;
7
8 /// <summary>
9 /// 图像的操作
10 /// 1、读写图像
11 /// 2、读写像素
12 /// 3、修改像素值
13 /// </summary>
14 /// <returns></returns>
15 int main()
16 {
17 //1、读写图像
18 //1.1、imread 可以指定加载灰度或者 RGB 图像
19 //1.2、imwrite 可以保存图像,类型由扩展名决定。
20 Mat src;
21 src = imread("D:\\360MoveData\\Users\\Administrator\\Desktop\\TestImage\\demo-gril.png", IMREAD_UNCHANGED);
22 if (src.empty())
23 {
24 cout << "图像加载失败!!!" << endl;
25 return -1;
26 }
27
28 namedWindow("原图", WINDOW_AUTOSIZE);
29 imshow("原图", src);
30
31 //2、读写像素
32 //2.1、都一个灰度(Gray)像素的像素值(CV_8UC1)
33 // Scalar intensity=src.at<uchar>(row,col);
34 // Scalar intensity=src.at<uchar>(Point(row,col));
35 //
36 //2.2、读一个彩色(RGB)像素点的像素值。
37 // Vec3f intensity=src.at<Vec3f>(row,col);
38 // float blue=intensity.val[0];
39 // float green=intensity.val[1];
40 // float red=intensity.val[2];
41 //
42 // Vec3f 就是 float 类型的 RGB 数据
43 //
44 //2.3、修改单通道灰度像素值
45 // src.at<uchar>(row,col)=128;
46 //
47 // 2.4、修改RGB 三通道像素值
48 // src.at<Vec3b>(row,col)[0]=128;
49 // src.at<Vec3b>(row,col)[1]=128;
50 // src.at<Vec3b>(row,col)[2]=128;
51 //
52 // 2.5、空白像素赋值
53 // src=Scalar(0);
54 //
55 //
56 // 2.6、Vec3b 与 Vec3f
57 // 2.6.1、Vec3b 对应三通道的顺序是 blue,green,red 的 uchar 类型数据
58 // 2.6.2、Vec3f 对应三通道的顺序是 blue,green,red 的 float 类型数据
59 // 2.6.3、把 CV_8UC1 转换为 CV32F1 实现如下:src.convertTo(dst,CV_32F);
60 //
61 //2.1、读取单通道像素值,示例代码:
62 Mat graySrc;
63 cvtColor(src, graySrc, COLOR_BGR2GRAY);//将彩色的 RGB 3 通道的转换为灰度单通道的图片。
64 namedWindow("单通道灰度图像", WINDOW_AUTOSIZE);
65 imshow("单通道灰度图像", graySrc);
66
67 int width = graySrc.cols;
68 int height = graySrc.rows;
69
70 for (int row = 0; row < height; row++)
71 {
72 for (int col = 0; col < width; col++)
73 {
74 //读取单通道、灰度的像素值
75 int gray = graySrc.at<uchar>(row, col);
76 //修改单通道、灰度的像素值
77 graySrc.at<uchar>(row, col) = 255 - gray;
78 }
79 }
80
81 imshow("修改后单通道灰度图像", graySrc);//可以直接使用显示图像,他会自动创建显示图片的窗口。
82
83 //处理多通道、彩色的图像
84 width = src.cols;
85 height = src.rows;
86 int channes = src.channels();
87
88 Mat dst;
89 dst.create(src.size(),src.type());
90
91 for (int row = 0; row < height; row++)
92 {
93 for (int col = 0; col < width; col++)
94 {
95 if (channes == 1)
96 {
97 //读取单通道、灰度的像素值
98 int gray = src.at<uchar>(row, col);
99 //修改单通道、灰度的像素值
100 src.at<uchar>(row, col) = 255 - gray;
101 }
102 else
103 {
104 //读取多通道、彩色像素值。Vec3b 就是指具有3个通道的 BGR 的数据结构
105 Vec3b myvalue=src.at<Vec3b>(row, col);
106 int b = myvalue.val[0];
107 int g = myvalue.val[1];
108 int r = myvalue.val[2];
109
110 //修改多通道、彩色像素值,这是取反效果。
111 /*dst.at<Vec3b>(row, col)[0] = 255 - b;
112 dst.at<Vec3b>(row, col)[1] = 255 - g;
113 dst.at<Vec3b>(row, col)[2] = 255 - r;*/
114
115 //修改多通道、彩色像素值,这是只包含蓝色和绿色,青就是色。
116 /*dst.at<Vec3b>(row, col)[0] = b;
117 dst.at<Vec3b>(row, col)[1] = g;
118 dst.at<Vec3b>(row, col)[2] = 0;*/
119
120 //修改多通道、彩色像素值,这是只包含蓝色和红色,就是紫色。
121 /*dst.at<Vec3b>(row, col)[0] = b;
122 dst.at<Vec3b>(row, col)[1] = 0;
123 dst.at<Vec3b>(row, col)[2] = r;*/
124
125 //修改多通道、彩色像素值,这是只包含绿色和红色,就是黄色。
126 dst.at<Vec3b>(row, col)[0] = 0;
127 dst.at<Vec3b>(row, col)[1] = g;
128 dst.at<Vec3b>(row, col)[2] = r;
129
130 //graySrc.at<uchar>(row, col) = min(r,min(b,g));取灰色第二个方法
131 }
132 }
133 }
134
135 imshow("修改后单、多通道图像", dst);//可以直接使用显示图像,他会自动创建显示图片的窗口。
136 //imshow("单通道灰度图像", graySrc);
137 //opencv 接口也可以实现这样反差的效果
138 bitwise_not(src, dst);
139
140 imshow("bitwise_not 修改后单、多通道图像", dst);//可以直接使用显示图像,他会自动创建显示图片的窗口。
141
142
143 waitKey(0);
144
145 system("pause");
146 return 0;
147 }
代码很简单,就不多说了。
效果如图:





以上就是图像修改后的效果图。
三、总结
这是 C++ 使用 OpenCV 的第五篇文章,其实也没那么难,感觉是不是还是很好入门的,那就继续。初见成效,继续努力。皇天不负有心人,不忘初心,继续努力,做自己喜欢做的,开心就好。
C++之OpenCV入门到提高005:005 图像操作的更多相关文章
- 【opencv入门篇】 10个程序快速上手opencv【上】
导言:本系列博客目的在于能够在vs快速上手opencv,理论知识涉及较少,大家有兴趣可以查阅其他博客深入了解相关的理论知识,本博客后续也会对图像方向的理论进一步分析,敬请期待:) PS:官方文档永远是 ...
- webdriver实用指南迁移至gitbbok并改名为selenium webdriver从入门到提高
背景 几年前我写了一本关于selenium webdriver的小册子,主要讲了一些selenium在进行测试过程中会遇到的场景以及解决方案,陆陆续续在github上收到了100+的star,在这里我 ...
- 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0 +VS 2013 开发环境配置
图片太多,具体过程参照: [OpenCV入门教程之一] 安装OpenCV:OpenCV 3.0.OpenCV 2.4.8.OpenCV 2.4.9 +VS 开发环境配置 说下我这边的设置: 选择deb ...
- 【OpenCV入门指南】第一篇 安装OpenCV
http://blog.csdn.net/morewindows/article/details/8225783/ win10下vs2015配置Opencv3.1.0过程详解(转) http://ww ...
- 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析(转)
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨) ...
- OpenCV入门学习笔记
OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...
- 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/19809337 作者:毛星云(浅墨 ...
- SignalR 2.0 入门与提高
SignalR 2.0 入门与提高 SignalR 2.0 最近整理了SignalR2.0 部分知识点,原文翻译,由于自己是土鳖,翻译得不好的地方,欢迎指正!仅供各位初学者学习! 第一节. 入门ASP ...
- OpenCV入门教程
OpenCV入门教程 作者:于仕琪 OpenCV入门教程.pdf
- opencv ,亮度调整【【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整
http://blog.csdn.net/poem_qianmo/article/details/21479533 [OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调 ...
随机推荐
- 使用Istio服务网格进行微服务网络治理
在Rainbond中,用户可以对不同的应用设置不同的治理模式,即用户可以通过切换应用的治理模式,来按需治理应用,这样带来的好处便是用户可以不被某一个ServiceMesh框架所绑定,且可以快速试错,能 ...
- 搭建QT开发环境
下载 Qt官网,Qt下载网址 安装前要登录账号,其他的该咋就咋样,路径不能有中文. 组件自己选 我的是MinGW.Android.虚拟键盘.Qt脚本.Qt Creator 然后创个项目,能跑起来就是安 ...
- 如何高效的阅读paper--三遍阅读法
第一遍 1.阅读文章的标题.摘要和介绍 2.阅读每一节的标题和副标题 3.阅读总结 4.浏览参考文献,看看是否有曾经读过的文章 在完成第一遍后,应该做到: 1.能够说出该篇论文的类型 2.能够说出文章 ...
- 鸿蒙(HarmonyOS)实现隐私政策弹窗
在实现用户协议弹窗时,通常我们会想到使用系统自定义弹窗,并在弹窗中点击跳转到Web页面.但在HarmonyOS中,由于系统弹窗的显示优先级高于其他组件,即使跳转到Web页面,弹窗依然会显示在最上层. ...
- ASP.NET Core – Configuration & Options
前言 之前就写过 Asp.net core 学习笔记 ( Configuration 配置 ) 只是有点乱, 这篇作为整理版. 项目中会有许许多多的 Config 要设定. 比较好的管理方式是把它们放 ...
- CSS – ellipsis and line-clamp
前言 CSS 很早就有 build-in 方案 for 省略号 ellipsis 了. 但是只能 one line, 遇到多行的时候只能用 JS. 后来出了 line-clamp 终于把 multip ...
- 系统编程-进程-当fork遇到管道,可能碰撞出什么?
第一部分 1. 直接上代码 #include <stdio.h> #include <unistd.h> #include <stdlib.h> int globv ...
- 2.2.2 PyTorch 2.0 GPU NVIDIA运行库的安装 ——CUDA+cuDNN安装教程
参考文章: https://blog.csdn.net/mbdong/article/details/121769951 CUDA download: https://developer.nvidia ...
- 视频剪辑过于卡顿,让Pr更流畅的技巧 ( 待测试 )
事件起因: 项目组某后期同事,使用Pr剪辑视频非常卡顿,但是机器配置是完全满足他的办公需求的 解决办法: 1. 降低回放分辨率 如果你的视频预览卡顿,首先应该考虑的,就是当前回放分辨率是否过高.通常在 ...
- 大模型应用开发初探 : 基于Coze创建Agent
大家好,我是Edison. 最近学习了一门课程<AI Agent入门实战>,了解了如何在Coze平台上创建AI Agent,发现它对我们个人(C端用户)而言十分有用,分享给你一下. Coz ...