OpenCvSharp从入门到实践-(02)图像处理的基本操作

目录

图像处理的基础操作

1、读取图像

1.1、读取当前目录下的图像

2、显示图像

2.1、Cv2.ImShow 用于显示图像。

2.2、Cv2.WaitKey方法用于等待用户按下键盘上按键的时间。

2.3、Cv2.DestroyAllWindows方法用于销毁所有正在显示图像的窗口。

2.4实例1-显示图像

2.4实例2-显示灰度图像

3、保存图像

3.1实例1-保存图像

4、获取图像属性

4.1实例1-获取图像属性


图像处理的基础操作

图像处理最基本的操作,包括读取图像、显示图像、保存图像、获取图像属性等

1、读取图像

OpenCvSharp提供了用于读取图像的Cv2.ImRead方法,函数如下:

public static Mat ImRead(string fileName, ImreadModes flags = ImreadModes.Color)

参数说明:

Mat:是ImRead方法的返回值,返回的是读取到的图像。

fileName:Name of file to be loaded.

要读取图像的完整的文件名。例如,要读取当前项目下的test.jpg,fileName的值为"test.jpg"(双引号为英文格式)。

flags:Specifies color type of the loaded image

读取图像颜色类型的标记,当flags的默认值为ImreadModes.Color时,表示读取的是彩色图像,此时的flags值可以省略,当flags的值为ImreadModes.Grayscale时,表示读取的是灰度图像(如果读取的是彩色图像,也可以将彩色图转换为灰度图)。

1.1、读取当前目录下的图像

在我们的测试Demo下,有一张test.jpg的图像,如下图

我们使用ImRead方法读取,再使用Dump方法查询像素值。代码如下:

Mat mat = Cv2.ImRead("test.jpg");
string info = mat.Dump();

2、显示图像

相比上图中秘密麻麻的数字,将图像显示出来,效果会更加直观,我们需要使用Cv2.ImShow、Cv2.WaitKey、Cv2.DestroyAllWindows。

2.1、Cv2.ImShow 用于显示图像。

函数如下:

public static void ImShow(string winName, Mat mat)

参数说明:

winName:显示图像的窗口名称。

mat:要实现的图像。

2.2、Cv2.WaitKey方法用于等待用户按下键盘上按键的时间。

用户按下键盘上的任意按键时,将执行Cv2.WaitKey方法,并且获取Cv2.WaitKey方法的返回值。其函数如下:

 public static int WaitKey(int delay = 0)

摘要:
    Waits for a pressed key.

参数:
  delay:
    Delay in milliseconds. 0 is the special value that means ”forever”

返回结果:
    Returns the code of the pressed key or -1 if no key was pressed before the specified
    time had elapsed.

2.3、Cv2.DestroyAllWindows方法用于销毁所有正在显示图像的窗口。

其函数为:

  public static void DestroyAllWindows()

2.4实例1-显示图像

代码如下:

Mat mat = Cv2.ImRead("test.jpg");
Cv2.ImShow("test.jpg", mat);
Cv2.WaitKey();
Cv2.DestroyAllWindows();

效果

2.4实例2-显示灰度图像

代码如下:

Mat mat = Cv2.ImRead("test.jpg",ImreadModes.Grayscale);
Cv2.ImShow("test.jpg", mat);

Cv2.WaitKey();
Cv2.DestroyAllWindows();

效果

3、保存图像

OpenCvSharp提供Cv2.ImWrite方法,用于按照指定路径保存图像。其函数为:

 public static bool ImWrite(string fileName, Mat img, int[]? prms = null)

摘要:
    Saves an image to a specified file.

参数:
  fileName:
    Name of the file.

  img:
    Image to be saved.

  prms:
    Format-specific save parameters encoded as pairs

3.1实例1-保存图像

代码如下:

Mat mat = Cv2.ImRead("test.jpg");
Cv2.ImWrite("dst.jpg",mat);

效果

4、获取图像属性

处理图像过程中,经常需要获取图像的大小,类型等图像属性。OpenCvSharp提供了获取常用的属性的方法,如下:

Data
       IntPtr类型的指针,指向Mat矩阵数据的首地址。一般不用。

Rows 或 Height
        Mat矩阵的行数,也是图片的高度(像素)。

Cols 或 Width
        Mat矩阵的列数,也是图片的宽度(像素)。

Size()
        Size() 返回 Width,Height 组成的结构。

Dims
        Mat矩阵的维度,若Mat是一个二维矩阵,则Dims=2,三维则Dims=3。

Channels()
        Mat矩阵元素的通道数。

        例如常见的RGB彩色图像,Channels =3;

        灰度图像只有一个灰度分量信息,Channels =1。

Depth()
        每一个像素中每一个通道的精度。

        在Opencv中,Mat.Depth()得到的是一个 0~6 的数字,分别代表不同的位数,

        对应关系如下:                            

                CV_8U=0

                CV_8S=1

                CV_16U=2

                CV_16S=3

                CV_32S=4

                CV_32F=5

                CV_64F=6     

        其中U是unsigned的意思,S表示signed,也就是有符号和无符号数。

ElemSize() and ElemSize1()
        矩阵中每一个元素的数据字节数(bytes)。

        如果Mat中的数据类型是CV_8UC1,那么ElemSize = 1;

        如果是CV_8UC3或CV_8SC3,那么 ElemSize = 3;

        如果是CV_16UC3或者CV_16SC3,那么 ElemSize = 6;

        可见,ElemSize是以字节为单位的;

        ElemSize1() 就是通道1的数据字节数。有:

        ElemSize1 = ElemSize / Channels

Step() and Step1()
        Mat矩阵中每一行的步长(字节),即为每一行中所有元素的字节总量。

        Step1() 是通道1的步长。有:

        Step1 = Step / ElemSize1

Type()
        Mat矩阵的类型,包含有矩阵中元素的类型以及通道数信息。

4.1实例1-获取图像属性

代码如下:

Mat mat = Cv2.ImRead("test.jpg");
Console.WriteLine("获取图像的属性");
Console.WriteLine("Data:" + mat.Data);
Console.WriteLine("Rows:" + mat.Rows);
Console.WriteLine("Height:" + mat.Height);
Console.WriteLine("Cols:" + mat.Cols);
Console.WriteLine("Width:" + mat.Width);
Console.WriteLine("Size:" + mat.Size());
Console.WriteLine("Dims:" + mat.Dims);
Console.WriteLine("Channels:" + mat.Channels());
Console.WriteLine("ElemSize:" + mat.ElemSize());
Console.WriteLine("ElemSize1:" + mat.ElemSize1());
Console.WriteLine("Step:" + mat.Step());
Console.WriteLine("Step1:" + mat.Step1());
Console.WriteLine("Type:" + mat.Type());
Console.ReadKey();

输出

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据分析基础之《matplotlib(1)—介绍》

一、什么是matplotlib 1、专门用于开发2D图表(包括3D图表) 2、使用起来及其简单 3、以渐进、交互方式实现数据可视化 4、matplotlib mat:matrix(矩阵) plot:画图 lib:库 二、为什么要学习m…

内部网关协议_路由信息协议RIP_开放路径优先OSPF协议_基本知识

目录: 因特网路由选择协议概述 路由信息协议RIP 开放路径优先OSPF协议 因特网路由选择协议概述 一.路由选择分类 静态路由选择和动态路由选择 静态路由选择: 采用人工配置的方式给路由器添加网络路由、默认路由和特定主机路由等路由条目。静态路由选择简单、开销小&#…

X2Keyarch迁移工具实战 | 将CentOS高效迁移至浪潮云峦操作系统KeyarchOS

X2Keyarch迁移工具实战 | 将CentOS高效迁移至浪潮云峦操作系统KeyarchOS 1. 搭建仿真线上业务环境2. 安装KeyarchOS操作系统和X2Keyarch迁移工具3. 将CentOS系统业务迁移至KeyarchOS系统 浪潮信息云峦操作系统KeyarchOS基于Linux Kernel、OpenAnolis等开源技术自主研发的一款服…

原理Redis-SkipList

SkipList ZipList和QuickList的共同特点是节省内存。在遍历元素时,只能从头到尾或从尾到头,所以在查找头尾元素性能还是不错的,但是中间元素查询的性能就会差。 **SkipList(跳表)**首先是链表,但与传统链表…

【C++入门到精通】 Lambda表达式 C++11 [ C++入门 ]

阅读导航 引言一、C98中的一个例子二、Lambda表达式1. Lambda表达式语法(1)Lambda表达式各部分说明(2)捕获列表说明 三、Lambda表达式的底层原理温馨提示 引言 当今软件开发行业的快速发展和日益复杂的需求,要求程序员…

万界星空科技SMT行业生产管理MES系统解决方案

一、SMT行业特点: SMT(Surface Mounted Technology)作为电子组装行业里首先的技术和工艺,选择合适的MES解决方案来保障SMT生产的成功至关重要。 电子行业涉及的范围非常广,包含了汽车、电脑、电视、手机等产品上&…

第三节-Android10.0 Binder通信原理(三)-ServiceManager篇

1、概述 在Android中,系统提供的服务被包装成一个个系统级service,这些service往往会在设备启动之时添加进Android系统,当某个应用想要调用系统某个服务的功能时,往往是向系统发出请求,调用该服务的外部接口。在上一节…

逸学java【初级菜鸟篇】9.5枚举

hi,我是逸尘,一起学java吧 枚举是信息的标志和分类 当一个变量有几种固定可能的取值时,就可以将它定义为类型的枚举。 优点:代码可读性好,入参约束严谨,代码优雅,是最好的信息分类技术&#x…

探秘开发app与小程序:一场技术与创新的博弈

app与小程序:一场技术与创新的博弈随着科技的飞速发展,移动应用程序已经成为我们日常生活中不可或缺的一部分。在这个充满竞争的时代,企业纷纷投身于开发各类移动应用,以期在市场中占据一席之地。然而,面对多样化的应用…

opencv-2D直方图

cv2.calcHist() 是 OpenCV 中用于计算直方图的函数。它可以计算一维或多维直方图,用于分析图像中像素值的分布。 基本的语法如下: hist cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])参数说明: images:…

【OpenCV实现图像:使用OpenCV进行图像处理之透视变换】

文章目录 概要计算公式举个栗子实际应用小结 概要 透视变换(Perspective Transformation)是一种图像处理中常用的变换手段,它用于将图像从一个视角映射到另一个视角,常被称为投影映射。透视变换可以用于矫正图像中的透视畸变&…

双系统Ubuntu-22.04.3安装编译kaldi

Ubuntu物理内存要求85-100G以上,运行内存5-6G以上(如果第一次安装的Ubuntu物理内存不够,请勿进行扩容,扩容易出现黑屏、蓝屏、死机的情况,应该卸载Ubuntu重新安装,在安装过程中进行内存分配;运行…