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

小白学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.lryc.cn/news/603213.html

相关文章:

  • 在 Web3 时代通过自我主权合规重塑 KYC/AML
  • [SWPU2019]Web1
  • 链表反转中最常用的方法————三指针法
  • PHP云原生架构:容器化、Kubernetes与Serverless实践
  • redis【1】
  • 小程序视频播放,与父视图一致等样式设置
  • zama test
  • 百元级工业级核心板:明远智睿×瑞萨V2H,开启AIoT开发新纪元
  • PDF转Word免费工具!批量处理PDF压缩,合并, OCR识别, 去水印, 签名等全功能详解
  • 数据结构之时间复杂度
  • 前端css 的固定布局,流式布局,弹性布局,自适应布局,响应式布局
  • ZKmall开源商城中台架构实践:API 网关与服务治理如何撑起电商技术骨架
  • 在 PolkaVM 上用 Rust 实现 ERC20 合约的全流程开发指南
  • 接口自动化测试pytest框架
  • c++-list
  • 【VOS虚拟操作系统】未来之窗打包工具在前端资源优化中的应用与优势分析——仙盟创梦IDE
  • Redis内存使用耗尽情况分析
  • 40+个常用的Linux指令——下
  • 艾利特机器人:光伏机器人如何重塑清洁能源制造新格局
  • 【CDH】CDH环境中升级ZooKeeper的实战记录
  • 基于KMeans、AgglomerativeClustering、DBSCAN、PCA的聚类分析的区域经济差异研究
  • 【Linux知识】Linux Shell 脚本中的 `set -ex` 命令深度解析
  • 复现cacti的RCE(CVE-2022-46169)
  • Go 客户端玩转 ES|QL API 直连与 Mapping Helpers 实战详解
  • upload-labs靶场通关(1-12)
  • 服务器之光:Nginx--反向代理模块详解及演练
  • 图论:Bellman_ford算法
  • 《汇编语言:基于X86处理器》第10章 结构和宏(3)
  • 【WRF-Chem 实例1】namelist.input 详解- 模拟CO2
  • 鸿蒙Harmony-自定义List组件,解决List组件手势滑动点击卡住问题