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

小白学OpenCV系列1-图像处理基本操作

由于工作需要,需要用到图像方面的知识技能,虽然在学校的时候学习过CS231N,但主要是深度学习方面,对于基础的图像原理没有做更多的了解。而后的工作中也一直没有接触图像相关的项目,因此此次也正好是个机会重新学习一下,并以此记录下我的学习过程。
既然要做图像相关的项目,怎么能绕开OpenCV呢?它是一个开源的计算机视觉库,最初由英特尔公司在1999年发起并开发,目的是为计算机视觉应用提供一套通用的基础工具。它功能很强大,几乎涵盖了计算机视觉的各个领域,同时可以在多种操作系统上运行,其核心代码使用 C/C++ 编写,但也提供了完善的Python接口(cv2模块),几乎成为了Python社区进行计算机视觉开发的首选库。

OpenCV安装

在Python环境下安装OpenCV非常简单,只需要运行以下命令即可:

pip install opencv-python

在这里插入图片描述
当前使用了Python3.9环境,OpenCV版本是4.12.0.88,安装完成后,导入cv2模块就可以用起来了。

图像处理基本操作

读取图像

在opencv里,可以使用imread函数来读取图像:

import cv2
retval = cv2.imread(file_name[, flags])
  • retval是返回值,正常的话就是读取到的图像,如果未读取到,则返回None。
  • file_name就是要读取的图像名。
  • flags是控制读取文件的类型,具体的取值和含义如下所示:

在这里插入图片描述在这里插入图片描述

显示图像

1、创建窗口
我们可以用下列函数来创建指定名称的窗口:

None = cv2.namedWindow(win_name)
  • win_name是要创建的窗口的名称。

2、显示图像

None = cv2.imshow(win_name, image)
  • win_name是窗口名称。
  • image是图像。

这里的win_name可以是事先创建好的窗口名称(比如使用namedWindow创建的),也可以是一个不存在的窗口名称(该函数就会自动创建指定该名称的窗口)

按键等待

有时候我们需要让屏幕一直显示该窗口,因此需要用到下列函数:

retval = cv2.waitKey([delay])
  • retval表示返回值。如果没有按键被按下,则返回-1;如果有按键被按下,则返回该按键的ASCII值。
  • delay表示等待键盘触发的事件,单位是ms。当该值是负数或者零时,表示无限等待。该值默认为0。

如果不使用该函数,图像就会一闪即逝,不会一直显示。

销毁窗口

1、销毁指定窗口
我们可以用以下函数来销毁指定的窗口:

None = cv2.destroyWindow(win_name)
  • win_name时窗口的名称

实际上该函数通常与cv2.waitKey()组合实现窗口的释放。
2、销毁所有窗口
有时候我们可能不止生成一个窗口,那么使用上个方法难免太麻烦了,因此可以使用下列函数,可以一次性销毁所有创建的窗口:

None = cv2.destroyAllWindows()

保存图像

当我们需要保存图像时,可以使用下列函数:

retval=cv2.imwrite(filename,img[,params])
  • retval是返回值。如果保存成功,则返回逻辑值真,如果保存不成功,则返回逻辑值假。
  • filename是要保存的文件完整路径名,包括扩展名。
  • img是被保存的图像。
  • params是保存类型参数,针对不同格式的图像,有很多选择,比如对于JPEG格式(后缀名为.jpg,.jpeg)的图像来说,有以下选项:
参数名含义默认值取值范围说明
cv2.IMWRITE_JPEG_QUALITY设置JPEG的压缩质量950-100值越高图像质量越好,值越低压缩率越高
cv2.IMWRITE_JPEG_PROGRESSIVE启用/禁用渐进式 JPEG00是禁用,1是启用渐进式 JPEG 在加载时从模糊到清晰逐步显示,适合网络传输
cv2.IMWRITE_JPEG_OPTIMIZE启用霍夫曼表优化00是禁用,1是启用通过优化霍夫曼编码表减小文件大小(不影响图像质量)
cv2.IMWRITE_JPEG_RST_INTERVAL设置 JPEG 重启间隔00-65535设置重启间隔可增强错误恢复能力,适合不可靠传输环境
cv2.IMWRITE_JPEG_LUMA_QUALITY单独设置亮度(Y 通道)质量00-100需与 cv2.IMWRITE_JPEG_CHROMA_QUALITY 配合使用
cv2.IMWRITE_JPEG_CHROMA_QUALITY单独设置色度(Cb/Cr 通道)质量00-100人眼对色度变化不敏感,降低此值可显著减小文件大小

我们以下列图片来举例部分选项的使用:
在这里插入图片描述

import cv2
import osimage_path = os.path.abspath(r"fruits.jpg")
raw_save_path = r"fruit_raw.jpg"
huff_save_path = r"fruit_huff.jpg"
chroma_save_path = r"fruit_chroma.jpg"fruit_image = cv2.imread(image_path)
cv2.imshow("fruit", fruit_image)cv2.waitKey()
# 高质量保存
cv2.imwrite(raw_save_path, fruit_image, [cv2.IMWRITE_JPEG_QUALITY, 100])
# 霍夫曼优化保存
cv2.imwrite(huff_save_path, fruit_image, [cv2.IMWRITE_JPEG_OPTIMIZE, 1])
# 低色度保存
cv2.imwrite(chroma_save_path, fruit_image, [cv2.IMWRITE_JPEG_LUMA_QUALITY, 100, cv2.IMWRITE_JPEG_CHROMA_QUALITY, 50])
cv2.destroyAllWindows()

cv2.IMWRITE_JPEG_QUALITY的保存效果如下:
在这里插入图片描述cv2.IMWRITE_JPEG_OPTIMIZE的保存效果如下:
在这里插入图片描述
cv2.IMWRITE_JPEG_LUMA_QUALITY和cv2.IMWRITE_JPEG_CHROMA_QUALITY的保存效果如下:
在这里插入图片描述
实际上看上去没有太大的差别,但是各自存储的大小还是有所差异的。

高质量霍夫曼优化低色度
161kb82.1kb117kb

使用另外两种方法保存,占用的存储空间小很多。

总结

本篇文章主要介绍了Python环境中OpenCV模块的安装,以及几个简单方法的使用:

  • cv2.imread:读取图像
  • cv2.namedWindow:创建窗口
  • cv2.imshow:显示图像
  • cv2.waitKey:等待按键输入
  • cv2.destroyWindow:销毁指定名字的窗口
  • cv2.destroyAllWindows:销毁所有创建的窗口
  • cv2.imwrite:保存图像

后续将逐步使用此模块搭建一些实用工具,只有理论和实践相结合才能更深刻地理解背后的奥秘。

http://www.xdnf.cn/news/16701.html

相关文章:

  • 机器学习-十大算法之一线性回归算法
  • gTest测试框架的安装与配置
  • Qt 并行计算框架与应用
  • 项目优化中对象的隐式共享
  • 从单机架构到分布式:Redis为何成为架构升级的关键一环?
  • 【开源项目】轻量加速利器 HubProxy 自建 Docker、GitHub 下载加速服务
  • Less Less基础
  • Docker学习相关视频笔记(二)
  • 负载均衡、算法/策略
  • ROUGE-WE:词向量化革新的文本生成评估框架
  • Java 9 新特性解析
  • 考古学家 - 华为OD统一考试(JavaScript 题解)
  • 算法第29天|动态规划dp2:不同路径、不同路径Ⅱ、整数拆分、不同的二叉搜索树
  • uipath数据写入excel的坑
  • Python 程序设计讲义(25):循环结构——嵌套循环
  • 《Spring Cloud Gateway 深度剖析:从核心原理到企业级实战》
  • WAIC 2025观察:昇腾助力AI融入多元化生活场景
  • 理解Transformer解码器
  • Github 连接救星,完全合规合法,无风险!
  • 操作系统-lecture2(操作系统结构)
  • 微服务 01
  • Objective-c 初阶——异常处理(try-catch)
  • Typecho handsome新增评论区QQ,抖音,b站等表情包
  • 用FunASR轻松实现音频转SRT字幕:完整脚本与解析
  • iOS仿写 —— 计算器
  • Python 程序设计讲义(28):字符串的用法——格式化字符串
  • [leetcode] 组合总和
  • 冒泡排序算法
  • Java中什么是类加载?类加载的过程?
  • bash变量名不能有连字符