当前位置: 首页 > news >正文

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();

输出

相关文章:

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

目录 图像处理的基础操作 1、读取图像 1.1、读取当前目录下的图像 2、显示图像 2.1、Cv2.ImShow 用于显示图像。 2.2、Cv2.WaitKey方法用于等待用户按下键盘上按键的时间。 2.3、Cv2.DestroyAllWindows方法用于销毁所有正在显示图像的窗口。 2.4实例1-显示图像 2.4实例…...

Spring Boot 升级3.x 指南

Spring Boot 升级3.x 指南 1. 升级思路 先创建一个parent项目&#xff0c;打包类型为pom&#xff0c;继承自spring boot的parent项目 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId&…...

使用支付宝的沙箱环境在本地配置模拟支付并发布至公网调试

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问9. 结语 前言 在沙箱环境调试支付SDK的时候&#xff0c;往往沙箱环境部署在本地&#xff0c;局限性大&#xff0c;在沙…...

python-opencv划痕检测

python-opencv划痕检测 这次实验&#xff0c;我们将对如下图片进行划痕检测&#xff0c;其实这个比较有难度&#xff0c;因为清晰度太差了。 我们做法如下&#xff1a; &#xff08;1&#xff09;读取图像为灰度图像&#xff0c;进行自适应直方图均衡化处理&#xff0c;增强图…...

微服务学习|Gateway网关:网关作用、快速入门、路由断言工厂、路由过滤器配置、全局过滤器、过滤器执行顺序、跨域问题处理

为什么需要网关 网关功能: 1.身份认证和权限校验 2.服务路由、负载均衡 3.请求限流 网关的技术实现 在SpringCloud中网关的实现包括两种:gateway、zuul Zuul是基于Servlet的实现&#xff0c;属于阻塞式编程。而SprinaCloudGateway则是基于Spring5中提供的WebFlux&#xf…...

七、通过libfdk_aac编解码器实现aac音频和pcm的编解码

前言 测试环境&#xff1a; ffmpeg的4.3.2自行编译版本windows环境qt5.12 AAC编码是MP3格式的后继产品&#xff0c;通常在相同的比特率下可以获得比MP3更高的声音质量&#xff0c;是iPhone、iPod、iPad、iTunes的标准音频格式。 AAC相较于MP3的改进包含&#xff1a; 更多的采…...

spring 是如何开启事务的, 核心原理是什么

文章目录 spring 是如何开启事务的核心原理1 基于注解开启事务2 基于代码来开启事务 spring 是如何开启事务的 核心原理 Spring事务管理的实现有许多细节&#xff0c;如果对整个接口框架有个大体了解会非常有利于我们理解事务&#xff0c;下面通过讲解Spring的事务接口来了解…...

头歌——操作系统实训总结

死锁 1、系统出现死锁时一定同时保持了四个必要条件&#xff0c;对资源采用按序分配算法后可破坏的条件是&#xff08;A&#xff09;。 A、循环等待条件B、互斥条件C、占有并等待条件D、不可抢占条件 2、资源的静态分配算法在解决死锁问题中是用于&#xff08;B&#xff09;。 …...

Django自动生成docs接口文档

1.创建Django项目 python manage.py startproject django20252.创建子应用 python manage.py startapp api3.安装依赖包 pip install coreapi4.创建urls.py from django.contrib import admin from django.urls import path, include from rest_framework import routers f…...

Mock 数据

1. Mock 数据的方式 2. json-server 实现 Mock 数据 项目中安装json-server npm i -D json-server准备一个json文件添加启动命令 //package.json"scripts": {"start": "craco start","build": "craco build","test&q…...

(三)C语言之for语句概述

&#xff08;三&#xff09;C语言之for语句概述 一、使用for语句实现打印华氏温度与摄氏温度转换二、for语句概述三、练习 一、使用for语句实现打印华氏温度与摄氏温度转换 #include <stdio.h> /*当华氏温度为 0,20,40,...300时&#xff0c;打印出华氏温度与摄氏温度对照…...

OpenLDAP配置web管理界面PhpLDAPAdmin服务-centos9stream

之前已经发了一篇关于centos9下面配置openldap多主高可用集群的内容&#xff0c;不会配置ldap集群的请参考&#xff1a;服务器集群配置LDAP统一认证高可用集群&#xff08;配置tsl安全链接&#xff09;-centos9stream-openldap2.6.2-CSDN博客 这里跟着前篇文章详细说明如何配置…...

深兰科技多款大模型技术产品登上新闻联播!

11月20日晚&#xff0c;新闻联播报道了2023中国5G工业互联网大会&#xff0c;深兰科技metamind、汉境大型城市智能体空间等大模型技术和产品在众多参展产品中脱颖而出&#xff0c;被重点播报。 2023中国5G工业互联网大会 本届大会由工信部和湖北省人民政府联合主办&#xff0c;…...

移远通信推出六款新型天线,为物联网客户带来更丰富的产品选择

近日&#xff0c;移远通信重磅推出六款新型天线&#xff0c;覆盖5G、非地面网络&#xff08;NTN&#xff09;等多种新技术&#xff0c;将为物联网终端等产品带来全新功能和更强大的连接性能。 移远通信COO张栋表示&#xff1a;“当前&#xff0c;物联网应用除了需要高性能的天线…...

八、ffmpeg录制视频为yuv文件

前言 测试环境&#xff1a; ffmpeg的4.3.2自行编译版本windows环境qt5.12 图片的一些重要知识&#xff1a; RGB图片 位深度&#xff1a;每一个像素都会使用n个二进制位来存储颜色信息。每一个像素的颜色都是由红&#xff08;Red&#xff09;、绿&#xff08;Green&#xff0…...

Rust并发编程:理解线程与并发

大家好&#xff01;我是lincyang。 今天我们来深入探讨Rust中的并发编程&#xff0c;特别是线程的使用和并发的基本概念。 Rust中的线程 Rust使用线程来实现并发。线程是操作系统可以同时运行的最小指令集。在Rust中&#xff0c;创建线程非常简单&#xff0c;但与此同时&…...

二次开发问题汇总【C#】

1未将对象引用到实例。 接口函数的参数不对。解决办法【用fixed去限制数组长度】 unsafe public struct VCI_BOARD_INFO {public UInt16 hw_Version;public UInt16 fw_Version;public UInt16 dr_Version;public UInt16 in_Version;public UInt16 irq_Num;public byte can_Num;…...

中职组网络安全B模块-渗透提权2

任务五:渗透提权2 任务环境说明: 仅能获取xxx的IP地址 用户名:test,密码:...

【考研】数据结构(更新到循环链表)

声明&#xff1a;所有代码都可以运行&#xff0c;可以直接粘贴运行&#xff08;只有库函数没有声明&#xff09; 线性表的定义和基本操作 基本操作 定义 静态&#xff1a; #include<stdio.h> #include<stdlib.h>#define MaxSize 10//静态 typedef struct{int d…...

DB2—03(DB2中常见基础操作)

DB2—03&#xff08;DB2中常见基础操作&#xff09; 1. 前言1.1 oracle和mysql相关 2. db2中的"dual"2.1 SYSIBM.SYSDUMMY12.2 使用VALUES2.3 SYSIBM.SYSDUMMY1 "变" dual 3. db2中常用函数3.1 nvl()、value()、COALESCE()3.2 NULLIF() 函数3.3 LISTAGG() …...

猫抓浏览器扩展:轻松捕获网页视频资源的终极指南

猫抓浏览器扩展&#xff1a;轻松捕获网页视频资源的终极指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否经常遇到在线视频无法下载的烦恼…...

【限时解禁】VS Code Copilot Next 企业版自动化工作流配置包(含Terraform模块+Prometheus成本看板+SLA保障模板)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;VS Code Copilot Next 自动化工作流配置 启用 Copilot Next 扩展与基础环境准备 确保已安装 VS Code 1.85 版本&#xff0c;并通过官方扩展市场安装最新版 Copilot Next&#xff08;ID: github.copil…...

WVP-GB28181-Pro语音广播技术架构优化:海康设备媒体流传输稳定性深度解析

WVP-GB28181-Pro语音广播技术架构优化&#xff1a;海康设备媒体流传输稳定性深度解析 【免费下载链接】wvp-GB28181-pro 基于GB28181-2016、部标808、部标1078标准实现的开箱即用的网络视频平台。自带管理页面&#xff0c;支持NAT穿透&#xff0c;支持海康、大华、宇视等品牌的…...

咖啡烘焙数据可视化平台Artisan:构建专业级烘焙过程控制的革命性方案

咖啡烘焙数据可视化平台Artisan&#xff1a;构建专业级烘焙过程控制的革命性方案 【免费下载链接】artisan artisan: the worlds most trusted roasting software 项目地址: https://gitcode.com/gh_mirrors/ar/artisan Artisan作为全球最受信赖的开源咖啡烘焙软件&…...

终极Windows 11优化指南:如何用一键脚本让系统性能飙升40%

终极Windows 11优化指南&#xff1a;如何用一键脚本让系统性能飙升40% 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter an…...

物料管理系统功能拆解:物料管理系统如何解决库存积压与生产缺料难题

物料管理系统是现代制造企业数字化转型的核心工具&#xff0c;它通过精准的功能拆解与流程优化&#xff0c;有效解决了传统生产模式中库存积压与生产缺料并存的顽疾。一套成熟的物料管理系统&#xff0c;不仅涵盖了从需求计划、采购执行到仓储物流的全链路管理&#xff0c;更通…...

从不及格到优秀论文,全靠这几个口碑炸裂的 AI 论文写作工具

还在为论文选题迷茫、初稿逻辑混乱、查重率爆表而焦虑&#xff1f;眼看截止日期逼近&#xff0c;熬夜几周写出的稿子仍被导师打回&#xff0c;评语满是 “结构松散、论据不足、AI 痕迹重”&#xff1f;别慌&#xff01;2026 年6 款口碑炸裂的 AI 论文写作神器&#xff0c;从选题…...

技术演讲从入门到精通:如何让台下开发者为你鼓掌?

在软件测试的职业生涯中&#xff0c;我们常常需要展示自己的工作成果、推广新的测试方法、或者在技术社区分享经验。无论是团队内部的分享会、跨部门的技术评审&#xff0c;还是在行业大会上的主题演讲&#xff0c;一场精彩的技术演讲&#xff0c;不仅能清晰地传递信息&#xf…...

告别踩坑!Ubuntu 22.04 LTS下RoboCup3D环境保姆级配置指南(含RoboViz编译加速技巧)

告别踩坑&#xff01;Ubuntu 22.04 LTS下RoboCup3D环境保姆级配置指南&#xff08;含RoboViz编译加速技巧&#xff09; 在机器人仿真和人工智能足球赛事领域&#xff0c;RoboCup3D一直是最具挑战性和教育意义的平台之一。然而对于刚接触这个领域的研究者和学生来说&#xff0c…...

桌游《展翅翱翔》新手入门:从规则解析到100分实战策略(含AI对战心得)

桌游《展翅翱翔》新手入门&#xff1a;从规则解析到100分实战策略&#xff08;含AI对战心得&#xff09; 第一次打开《展翅翱翔》的盒子时&#xff0c;我被那些精美的鸟类卡牌和色彩斑斓的栖息地板块深深吸引。作为一款以观鸟为主题的策略桌游&#xff0c;它巧妙地将生态知识与…...