OpenCV入坑第一天:图像的基础操作

news2024/11/23 23:43:07

我们都知道,OpenCV能够帮助我们处理视频和图像,咱们在图像处理中,除了Pillow库之外,最经常用到的也是它了。那么现在咱们就正式入坑OpenCV for Python,一起来感受一下OpenCV的魅力吧!

文章目录

  • 读取图像 imread()
  • 展示图片 imshow()
  • 等待按键 waitKey()
  • 保存图像 imwrite()

读取图像 imread()

OpenCv提供了一种cv2.imread的方法来读取图像。记忆方法也很简单image+read=imgread。我们可以使用这个函数读取多种静态图像。

一般来说,我们在括号内加入我们所要读取图片的地址就可以了。这个地址既可以是计算机的绝对地址,也可以是相对于咱们程序所在地的相对地址

除此之外呢,我们还有一个可选的参数,对于普通的开发者来说,平时一般并不会用到这样的参数传入。那么这里咱们就简单介绍几个,详细内容大家可以看看OpenCV官网。

  1. cv2.IMREAD_UNCHAGE
    顾名思义,这个参数就是咱们保持图像原格式不变,它所对应的数值是-1,也就是说,在传参的时候,我们既可以传上面的那么一大串英文字母,也可以传-1这个值。我们要注意的是,当我们不传参的时候,OpenCV会直接将我们的图片调整成为3通道的BGR图像

    BGR通常是指一种颜色表示方式,即以蓝色(Blue)、绿色(Green)、红色(Red)的顺序来描述图像或像素的颜色值。在计算机图形学、计算机视觉、数字图像处理等领域常常使用BGR表示颜色,也是OpenCV等计算机视觉库中默认的颜色表示方式。

    如果我们是在OpenCV中处理的话,出于对兼容性和实现的方便考虑,咱们使用BGR的图像可能会更方便一些。

  2. cv2.IMREAD_GRAYSCALE
    在使用程序时,我们可能会要对图片进行灰度处理。灰度处理是将彩色图像转为灰度图像的过程。灰度图像只有一个通道,代表亮度信息,而彩色图像有3个通道,分别代表红、绿、蓝三种颜色,每种颜色的亮度信息不同。那么我们也可以使用数值0传入。

    灰度处理的意义主要有以下几点:

    1. 简化图像:把彩色图像转为灰度图像,可以降低图像的复杂度,减少计算量,方便后续算法的实现。

    2. 分析物体:对于一些物体的特征,如纹理、形状、边缘等,可以通过灰度图像来提取和分析,比如在图像识别、目标跟踪、行人检测等方面被广泛应用。

    3. 去除噪声:在一些图像处理任务中,如图像增强、去噪等,通过灰度处理可以更好地去除图像的噪声,从而提高图像质量。

    也就是说,我们只需要几行代码就能完成灰度值的一个转换。

    import cv2
    
    img = cv2.imread("./1234.jpg",0)
    cv2.imwrite("test.jpg",img)
    

    在这里插入图片描述

  3. cv2.IMREAD_REDUCED_COLOR(GRAYSCALE)_2(4/8)

    这一行代码则是减小我们图片的大小。我们可以选择缩小的倍数(即上面的数字);同时也可以选择我们将图片设置成灰白还是彩色的。灰色我们就设置GRAYSCALE,若是彩色我们就设置COLOR

    比如说我想得到一张黑白缩小8倍的图片,我们将使用以下代码就可以一步搞定。我们可以非常明显地看到其中的差异

    import cv2
    
    img = cv2.imread("./1234.jpg",cv2.IMREAD_REDUCED_GRAYSCALE_8)
    cv2.imwrite("test.jpg",img)
    

    在这里插入图片描述


那么我们现在就来观察一下我们读取图像之后的输入吧!可以看到程序输出了部分像素值哦~
在这里插入图片描述

展示图片 imshow()

在OpenCV中,我们有多种创建窗口的方法。我们就挑选最简单也是最常用的一种方法进行讲解。需要注意的是,OpenCV库本身并不支持中文显示,咱们标题必须改成英文进行显示。(虽然网上有些方法可以用encode()方法将文本转换成为UTF-8,但是根据本人实操发现这种方法并不可行)

咱们用的函数叫做 imshow()这个方法可以打开一个新的窗口,并在窗口中显示我们所打开的图片,这个方法非常好用,我们只需要传入两个参数。

  • 窗口名称
  • 显示图片
import cv2

img = cv2.imread("./LFS.jpg",cv2.IMREAD_REDUCED_GRAYSCALE_8)
cv2.imshow("LuoFuMountain",img)
cv2.waitKey()

在这里插入图片描述

在使用这个方法时,它的底层逻辑是这样的:首先先创建一个指定名称的窗口,然后将图片显示在刚刚创建的窗口内。需要注意的是,这两个参数(名称与图片)都是必须导入的,否则会引起程序的报错哦~

等待按键 waitKey()

如果上一个实例没有最后一行的话,我们会看到窗口一闪而过,根本看不到任何界面。那么这个时候,我们可以等待用户的键盘输入,这样我们就可以让用户看清楚想要展示的界面了~

那么这个函数是waitKey()这个函数会等待键盘上的按键按下,当按下后,它会返回按下的键,这个时候我们可以根据返回值进行进一步的判断。我们要注意的是,返回值是ASCLL码,所以我们要了解想要获得的按键所对应的ASCLL。如果不想记这些特殊的编码,我们可以使用Python提供的ord()方法进行转换就可以了~

那么除此之外,我们还可以设置等待时间。当我们传入的值是负值或零的时候。表示无限等待,除此之外,我们将会等待以毫秒为单位的传入的数字。

import cv2

img = cv2.imread("./LFS.jpg",cv2.IMREAD_REDUCED_GRAYSCALE_8)
cv2.imshow("LuoFuMountain",img)
return_key = cv2.waitKey()

if return_key == ord("a"):
	cv2.imshow("PRESS A",img)
elif return_key == ord("b"):
	cv2.imshow("PRESS B",img)

cv2.waitKey()

在这里插入图片描述

同时我们还要注意大小写哈~OpenCV对大小写的要求也是十分严格的呢

我们还可以使用print()来查看我们WaitKey()的等待期间。我们可以发现,当我们在执行Waitkey()时,整个程序处于静止状态,当我们按下键盘上的按键后,程序才得以进行,并在控制台上输出了我们想要其输出的文字。

import cv2

img = cv2.imread("./LFS.jpg",cv2.IMREAD_REDUCED_GRAYSCALE_8)
cv2.imshow("LuoFuMountain",img)
return_key = cv2.waitKey()

if return_key == ord("a"):
	cv2.imshow("PRESS A",img)
elif return_key == ord("b"):
	cv2.imshow("PRESS B",img)

cv2.waitKey()
print("第二次触发按键")

在这里插入图片描述

保存图像 imwrite()

OpenCV和其他程序不一样的地方在于,我们保存不再是使用save()这样的函数,而是一个叫做imwrite()的函数。这个函数有两个必需参数和一个选填参数。

  • filename
    保存的路径,既可以是相对路径也可以是绝对路径
  • img
    保存图像的代码文件
  • params
    一个保存类型的参数,一般并不会用到
import cv2

img = cv2.imread("./LFS.jpg",cv2.IMREAD_REDUCED_GRAYSCALE_8)
cv2.imwrite("./GrayScale_LFS.jpg",img)

在这里插入图片描述

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

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

相关文章

GAMES101笔记 Lecture11 Geometry 2(Curces and Surfaces)

目录 Explicit Representations in Computer Graphics(计算机图形学中的显式几何表示)Point Cloud(点云)Polygon Mesh(多边形网格)The Wavefront Object File(.obj) Format(OBJ格式文件) Curves(曲线)Bezier Curves(贝塞尔曲线)Defining Cubic Bezier Curve With Tangents(定义…

el-checkbox和el-switch绑定一个Number值

因为我们对状态这种字段,后端一般返回的是Number值。0为正常,1为停用。 el-switch,el-checkbox这种控件呢,一般是绑定布尔值的。原来我的做法是使用value和change事件来做转换,而不是v-model。但是后来发现&#xff0c…

row_number 和 cte 使用实例:按照队列进行数据抵消

row_number 和 cte 使用实例:按照队列进行数据抵消 问题来源模拟数据使用 cte使用sum结合开窗函数结合 row_number 最终实现完整的模拟代码小结问题来源 今天无聊的翻了翻以前的论坛的帖子。。。嗯,想把一些没有什么价值的消息记录给删除掉,就是那些专家分获取记录。 毕竟,…

二次元少女-InsCode Stable Diffusion 美图活动一期

一、 Stable Diffusion 模型在线使用地址: https://inscode.csdn.net/inscode/Stable-Diffusion 二、模型相关版本和参数配置: 模型版本:chilloutmix_NiPrunedFp32Fix.safetensors 采样方法(Sampler)Sampling method:DPM SDE …

Elasticsearch--客户端

Es客户端 语言无关 ​ java最常用的客户端是Java Client、Java Rest Client、Java Transport Client Java Client 从es7.17开始,官方推出Java Client,并且将Java Rest Client标为Deprecated(过期) 要求jdk至少要jdk8 具体用法…

大模型技术发展概述 -(四)

文本内容参考论文《A Survey of Large Language Models》 论文标题:A Survey of Large Language Models 论文链接:https://arxiv.org/pdf/2303.18223v10.pdf 大模型技术发展概述 -(四) 6. 使用方法6.1 上下文学习6.1.1 提示形式6.…

网络套接字编程(三)(HTTP)

gitee仓库:https://gitee.com/WangZihao64/linux/tree/master/CalTcp 一、重谈协议 协议是一种“约定”,这种约定是双方都知道的。有了一致的约定,双方才能够正常地进行通信。协议在网络的第一篇博客中也提到过,协议是双方进行通…

uniapp中H5定位功能实现

1.要实现该功能 必须使用vue-jsonp进行跨域 JSONP是一种跨域数据请求的解决方案,它使用script元素来请求数据,再利用回调函数将数据传回页面。 Vue框架提供了对JSONP的支持,可以方便地在Vue应用中使用JSONP获取跨域数据。下面我们来了解一下…

【Java】StringBuffer和StringBuilder

共同点 他们都是可变的,在每次进行修改操作时,都不会产生新的对象,所以在进行修改的时候,尽量使用这两种类型的字符串 不同点 StringBuffer在单线程中效率高 StringBuilder用于多线程确保安全性 测试代码 public class test …

keepalived安装配置详解

文章目录 高可用介绍keepalived安装、使用vip漂移抓包脑裂脑裂有没有危害?如果有危害对业务有什么影响? keepalived架构双vip架构 Healthcheck实现 notifyVRRP选举格式 高可用 介绍 高可用性(High Availability)是指系统或服务能…

Linux的locale本地化配置

Linux的locale本地化配置 locale简介localectl常用操作语言环境键盘布局 常见问题:配置语言环境报错Linux系统locale(UTF-8)报错最小化自动安装的Centos7修改完整中文显示 locale简介 参考: http://m.blog.chinaunix.net/uid-20621049-id-3427444.html locale把按照所涉及到的…

Python调用ImageMagick生成PDF文件缩略图

使用Python调用ImageMagick生成PDF文件缩略图 Imagemagick使用Ghostscript作为其依赖项之一,以便能够处理和转换PDF相关的图像。 准备 安装Ghostscript,网站安装ImageMagick,网站 安装完毕后,需要自行配置环境路径 脚本 使用示…

灌区信息化智能测控一体化闸门系统解决方案

一、方案背景 闸门是节水灌溉工程中重要组成部分。在农田灌区中,一方面存在传统手摇闸门,未能实现自动化、数字化,另一方面部分灌区闸站虽然部分实现了自动化控制,但是由于闸站较多,有些位置较为偏僻,部分水…

网络数据安全风险评估实施指引(一)

近日,全国信息安全标准化技术委员会发布了《网络安全标准实践指南 网络数据安全风险评估实施指引》(TC260-PG-20231A v1.0-202305),旨在响应《数据安全法》要求,落实重要数据处理过程风险评估,衔接已发布的…

前端开发中的微服务架构设计

前端服务化和小程序容器技术为前端应用带来了更好的组织结构、可维护性和可扩展性。这些技术的应用将促进前端开发的创新和发展,使团队能够更好地应对复杂的前端需求和业务挑战。通过将前端视为一个服务化的架构,我们能够构建出更强大、可靠且可持续的前…

OpenCv (C++) 使用矩形 Rect 覆盖图像中某个区域

文章目录 1. 使用矩形将图像中某个区域置为黑色2. cv::Rect 类介绍 1. 使用矩形将图像中某个区域置为黑色 推荐参考博客:OpenCV实现将任意形状ROI区域置黑(多边形区域置黑) 比较常用的是使用 Rect 矩形实现该功能,代码如下&…

vmware-ubuntu 出现的奇怪问题

虚拟机突然连不上网 参考博文-CSDN-卍一十二画卍(作者)-Vmware虚拟机突然连接不上网络【方案集合】 sudo vim /var/lib/NetworkManager/NetworkManager.statesudo service network-manager stop sudo vim /var/lib/NetworkManager/NetworkManager.stat…

华为云子网路由表作用及价值

子网路由表 子网路由表作用云专线、VPN的配置与子网路由表强关联,本质是在相应的子网路由表中添加了一条路由Nat路由表问题地址变更问题snat和dnat 子网路由表作用 子网内部作为一个二层网络,通过mac地址互通,不通过路由互通。跨子网&#x…

Java Vue物联网系统

一个简单易用的物联网平台,可用于搭建物联网平台以及二次开发和学习。适用于智能家居、智慧办公、智慧社区、农业监测、水利监测、工业控制等。 系统后端采用Spring boot;前端采用Vue;消息服务器采用EMQX; 技术栈 服务端相关技术…

Vector - CANoe - DoIP在CANoe应用

目录 背景说明 一、DoIP通信说明 1、连接(Connection) 2、车辆发现(Vehicle Discovery)