【图像处理OpenCV(C++版)】——2.3 灰度/彩色图像数字化

news2024/11/26 22:48:20

前言

😊😊😊欢迎来到本博客😊😊😊

🌟🌟🌟 本专栏主要结合OpenCV和C++来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快速查询等,随时更新。

😊😊😊 具体食用方式:可以点击本专栏【OpenCV快速查找(更新中)】–>搜索你要查询的算子名称或相关知识点,或者通过这篇博客👉通俗易懂OpenCV(C++版)详细教程——OpenCV函数快速查找(不断更新中)]查阅你想知道的知识,即可食用。

🎁🎁🎁支持:如果觉得博主的文章还不错或者您用得到的话,可以悄悄关注一下博主哈,如果三连收藏支持就更好啦!这就是给予我最大的支持!😙😙😙


文章目录

    • 学习目标
    • 一、 灰度图像数字化
      • 1.1 灰度图像转换为Mat
    • 二、 彩色图像数字化
      • 2.1 将RGB彩色图像转换为多通道Mat
    • 三、 总结

学习目标

  • 了解灰度图像数字化基础知识
  • 了解彩色图像数字化基础知识

一、 灰度图像数字化

  首先,对灰度图像做个简单介绍。例如,计算机中存储的一张灰度图像,右击–>属性–>详细信息

  下图中,每一个方格代表图像的一个像素,水平方向上的方格数对应上图中的“宽度”,垂直方向上的方格数对应上图中的“高度”,计算机会将每一个方格数字化为一个数值,上图中的“位深度”是8(bit),代表将每一个方格数字化为[0,255]之间的uchar类型数字,即用256个数字来衡量灰度的深浅,值越大,代表越亮,值越小,代表越灰,255代表白色,0代表黑色
  实际上,计算机“看到”这张图像是一个224行(高度)*224列(宽度)的二维数字矩阵。数字图像处理的本质就是操作矩阵。

  

1.1 灰度图像转换为Mat

  (1) 读取

  在 opencv2/highgui/highgui.hpp 头文件中声明了读取本地磁盘中的灰度图像并转换为Mat的函数:

Mat imread(const string filename,int flags=1);

  本专栏主要以OpenCV3.x为主,对于OpenCV2.x与OpenCV3.x版本略有区别:

版本filenameflags
OpenCV2.x图像文件名(可含路径)CV_LOAD_IMAGE_COLOR:彩色图像;CV_LOAD_IMAGE_GRAYSCALE:灰度图像;CV_LOAD_IMAGE_ANYCOLOR:任意图像
OpenCV3.x同上IMREAD_COLOR:彩色图像;IMREAD_GRAYSCALE:灰度图像;IMREAD_ANYCOLOR:任意图像

  
  (2) 显示

  参数flags为常用的几种。相反,如何将Mat对象作为图像进行显示呢?在highgui模块中定义了imshow函数来完成该功能。

void imread(const string winname,InputArray mat);

  winname:显示图像窗口名;
  mat:Mat对象;

  imreadimshow这两个函数,就可以完成读取并显示图像了。下面演示一个灰度图像读取显示小程序:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

int  main(int argc, char**argv) {

	Mat image;
	image = imread("D:/VSCodeFile/OpenCV_CSDN/image/logo_gray.jpeg",IMREAD_GRAYSCALE);

	if (image.empty()){
		return -1;
	}

	//namedWindow("图片显示", WINDOW_AUTOSIZE);
	string winname = "图片显示";
	imshow(winname,image);
	
	waitKey(0);
	//destroyAllWindows();

	return 0;

}

  注意: 如果读取一个彩色图像文件,imread的参数flags设置的是读入灰度图像,那么会对彩色图像进行灰度化处理

  

二、 彩色图像数字化

  同样,对彩色图像做个简单介绍,对彩色图像数字化的理解,和对灰度图像数字化的理解类似。例如,计算机中存储的一张彩色图像,右击–>属性–>详细信息

  使用图像编辑器打开该图像,放大观察图像,会出现类似于下图的样子,有很多小方格,但是这些方格都是彩色的,不是灰色的。其实每一个彩色的方格都是由三个数值量化的,或者说是由一个具有三个元素的向量量化的。
  灰度图像的每一个像素都是由一个数字量化的,而彩色图像的每一个像素都是由三个数字组成的向量量化的。最常用的是由R、G、B三个分量来量化的,具体色彩的值用三个元素的向量来表示,这三个元素的数值分别代表三种基色:Red、Green、Blue的亮度

  假设每种基色的数值量化成m= 2 n 2^n 2n个数,如同8位灰度图像一样,将灰度量化成 2 8 2^8 28 =256个数。RGB图像的红、绿、蓝三个通道的图像都是一张8位图,因此颜色的总数为 25 6 3 256^3 2563 =16777216,如:

  (0,0,0):代表黑色;
  (255,255,255):代表白色;
  (255,0,0):代表红色。

  

2.1 将RGB彩色图像转换为多通道Mat

  需将imread的flags修改一下,就可以将彩色图像转换为三通道的Mat对象,对于彩色图像的每一个方格,我们可以理解为一个Vec3b

  需要注意的是:在OpenCV中,每一个像素的向量不是按照R、G、B分量排列的,而是按照B、G、R顺序排列的,所以通过split函数分离通道后,先后得到的是B、G、R通道。

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

int  main(int argc, char**argv) {
	//彩色图像
	Mat image;
	image = imread("D:/VSCodeFile/OpenCV_CSDN/image/logo.jpeg",IMREAD_COLOR);

	vector<Mat> Img;
	split(image, Img);
	imshow("原图", image);
	
	//channel--1
	Mat channel_1 = Img[0];
	imshow("第一通道—Blue", channel_1);

	//channel--2
	Mat channel_2 = Img[1];
	imshow("第二通道—Green", channel_2);

	//channel--1
	Mat channel_3 = Img[2];
	imshow("第三通道--Red", channel_3);

	waitKey(0);

	return 0;

}

  图中,经过和原图对比,可以直观感受到不同通道图像的差异。


三、 总结

  最后,长话短说,大家看完就好好动手实践一下,切记不能三分钟热度、三天打鱼,两天晒网。OpenCV是学习图像处理理论知识比较好的一个途径,大家也可以自己尝试写写博客,来记录大家平时学习的进度,可以和网上众多学者一起交流、探讨,有什么问题希望大家可以积极评论交流,我也会及时更新,来督促自己学习进度。希望大家觉得不错的可以点赞、关注、收藏。


🚶🚶🚶今天的文章就到这里啦~
喜欢的话,点赞👍、收藏⭐️、关注💟哦 ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86063.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于无人机的移动边缘计算网络(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 空中无人机&#xff08;UAV&#xff09;长期以来一直被用作移动网络中的网络处理器&#xff0c;但它们现在被用作移动边缘计算…

29-Vue之ECharts-散点图

ECharts-散点图前言散点图特点散点图实现步骤散点图常见效果气泡效果涟漪动画效果完整代码前言 本篇来学习散点图的实现 散点图特点 散点图可以帮助我们推断出不同维度数据之间的相关性, 比如&#xff1a;看得出身高和体重是正相关, 身 高越高, 体重越重散点图也经常用在地图…

解决 AssertionError Torch not compiled with CUDA enabled

最近在矩池云的的Tesla K80机子上跑MMYOLO&#xff0c;跟着MMYOLO官方文档《自定义数据集 标注训练测试部署 全流程 》操作到 “2.1.1 软件或者算法辅助”时&#xff0c;利用预训练模型官方脚本去辅助标注时&#xff0c;一按下回车就报错&#xff1a; 报错信息 AssertionError…

技巧分享:你知道视频转文字怎么操作?

随着科技的发展&#xff0c;很多东西都开通了“线上”这个渠道&#xff0c;例如线上教学、线上问诊等等。而我们也越来越习惯“线上”&#xff0c;因为它不仅方便&#xff0c;还更节省时间。例如我&#xff0c;学习一些知识或技能时&#xff0c;我会在网上寻找教学视频或报线上…

flink单机部署和简单使用

flink单机部署 Java版本&#xff1a;1.8.0_45 flink下载&#xff1a;https://archive.apache.org/dist/flink/flink-1.7.2/flink-1.7.2-bin-scala_2.11.tgz 解压安装包&#xff1a; [rootvm-9f-mysteel-dc-ebc-test03 opt]# tar -zxvf flink-1.7.2-bin-scala_2.11.tgz flin…

莽荒纪人物出场数据统计

今天继续给大家介绍Python相关知识&#xff0c;本文主要内容莽荒纪人物出场数据统计。 一、中文文本词频统计思路 在上文Python英文词频统计&#xff08;哈姆雷特&#xff09;程序示例中&#xff0c;我们进行了英文单词的统计。今天&#xff0c;我们进行中文人物出场频率统计…

java服装经销系统服装进销系统

简介 Ssm服装经销系统&#xff0c;主要分为6个角色&#xff1a;管理员、资料员、采购员、仓库员、售卖员、财务。采购员进行采购入库&#xff1b;仓库员进行采购入库、退货入库、提货出库、折损出库等库存管理&#xff1b;售卖员进行填单的创建&#xff0c;然后去仓库那里提货…

Score Matching

目录简介Score Function求解方法emm参考简介 score matching算法是一种求解概率密度函数的参数的算法。 在很多情况下&#xff0c;概率密度函数可以表示为&#xff1a; p(ξ;θ)1Z(θ)q(ξ;θ)p(\xi;\theta)\frac{1}{Z(\theta)}q(\xi;\theta) p(ξ;θ)Z(θ)1​q(ξ;θ) 假设我…

[Java] 什么是锁?什么是并发控制?线程安全又是什么?锁的本质是什么?如何实现一个锁?

文章目录前言并发控制并发访问控制是什么&#xff1f;如何实现并发访问控制&#xff1f;并发访问控制 与 线程安全锁是什么&#xff1f;1. 加锁操作2. 解锁操作锁状态是什么&#xff1f;如何实现一个锁&#xff1f;笔者相关博客连接结语前言 多线程编程中&#xff0c;锁是最重要…

oracle (+)学习

最近工作需要将oracle的存储过程转化为hive的sql脚本。遇到很多不一样的地方&#xff0c;例如oracle连接中有()号的用法。 借鉴这篇文章&#xff0c;但是这个排版比较烂。。。 oracle ()的,Oracle中()的作用_大雪菜的博客-CSDN博客 先建表和插入数据 --生成部门表CREATE TA…

2014年蓝桥杯Java C组——猜年龄

2014年蓝桥杯Java C组——猜年龄 标题&#xff1a;猜年龄 小明带两个妹妹参加元宵灯会。别人问她们多大了&#xff0c;她们调皮地说:“ 我们俩的年龄之积是年龄之和的6倍”。 小明又补充说:“她们可不是双胞胎&#xff0c;年龄差肯定也不超过8岁啊。” 请你写出:小明的较小的…

状态模式

文章目录状态模式1.状态模式的本质2.何时选用状态模式3.优缺点4.状态模式的结构5.实现上下文中维护状态及转换状态上下文中维护状态处理类中转换状态状态模式 状态模式说白了就是不同的状态&#xff0c;执行不同的行为&#xff0c;也就是状态和行为分离 1.状态模式的本质 状态模…

Eclipse+Java+Swing+Mysql实现自助存取款机(ATM)系统

EclipseJavaSwingMysql实现自助存取款机ATM系统一、系统介绍1.系统功能2.环境配置3.数据库4.工程截图二、系统展示1.登录页1.1登录成功2.注册系统3.取款3.1取款成功4.存款4.1 存款成功5.转账6.余额查询7.退出系统三、部分代码DBUtil.javaLoginFrame.javaAccount.java四、其他获…

python编程 for循环注意点与大写转换案例

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 range方法 一for循环表达式 for循环表达式 与数字有关 与单位有关 前言…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java基于信息安全的无锡旅游服务系统5l83d

面对老师五花八门的设计要求&#xff0c;首先自己要明确好自己的题目方向&#xff0c;并且与老师多多沟通&#xff0c;用什么编程语言&#xff0c;使用到什么数据库&#xff0c;确定好了&#xff0c;在开始着手毕业设计。 1&#xff1a;选择课题的第一选择就是尽量选择指导老师…

MHA的故障切换你掌握了吗?

MHA的概述 什么是MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过程…

用Python构建Amazon产品推荐系统!这项目价值能有2000吗?

引言 该项目的目标是部分重建Amazon电子类产品的推荐系统。 现在是十二月&#xff01;你是什么类型的购物者&#xff1f;双十二都购买了吗&#xff1f;你是把当天想购买的所有产品都保存起来&#xff0c;还是宁愿打开网站&#xff0c;查看带有巨大折扣的现场优惠呢&#xff1…

从单服务器模式到负载均衡设计

从单服务器模式到负载均衡设计 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;从单服务器模式到负载均衡设计 CSDN&#xff1a;从单服务器模式到负载均衡设计 单服务器模型是最简单的一种架构&#xff0c;参考如下图 用户访问一个 URL&#xff0c;URL 会…

java计算机毕业设计基于安卓Android的校园外卖点餐APP

项目介绍 餐饮行业是一个传统的行业。根据当前发展现状,网络信息时代的全面普及,餐饮行业也在发生着变化,单就点餐这一方面,利用手机点单正在逐步进入人们的生活。传统的点餐方式,不仅会耗费大量的人力、时间,有时候还会出错。Android系统伴随智能手机为我们提供了新的方向。手…

基于转换器 (MMC) 技术和电压源转换器 (VSC) 的高压直流 (HVDC) 模型(MatlabSimulink实现)

目录 1 概述 2 主要模块说明 2.1 简化电网 2.2 转换器 1 2.3 直流电路 2.4 控制器 2.5 示波器和测量 3 讲解 3.1 参数设置 3.2 SPS 比较 3.3 结果比较 3.4 参考文献 4 Matlab代码实现 1 概述 1000 MW HVDC-MMC 互连的 SPS 模型。本文基于模块化多电平转换器 (MMC)…