【Python】计算机视觉应用:OpenCV库图像处理入门

计算机视觉应用:OpenCV库图像处理入门

在当今的数字化时代,计算机视觉(Computer Vision)已经渗透到各行各业,比如自动驾驶、智能监控、医疗影像分析等。而 Python 的 OpenCV 库(Open Source Computer Vision Library)因其强大且开源的特性,被广泛应用于图像处理和计算机视觉应用中。本文将详细介绍 OpenCV 的基本功能和常见的图像处理操作,并通过一个完整的实战项目展示 OpenCV 在图像处理中的应用。
在这里插入图片描述

一、OpenCV简介

OpenCV 是一个开源计算机视觉库,最初由英特尔开发,现在被广泛用于各类图像和视频处理任务。OpenCV 提供了多种图像处理算法,涵盖了从图像基础操作到复杂机器学习应用的各个方面。它支持多种编程语言,如 C++、Python 和 Java,并且能够在多个平台(Windows、Linux、macOS)上运行。

安装OpenCV

可以通过以下命令安装 OpenCV:

pip install opencv-python

安装完成后,导入库进行初始化:

import cv2

在这里插入图片描述

二、图像的基本概念

在开始学习 OpenCV 的功能之前,我们需要了解一些基本的图像概念。

  1. 像素:图像由多个小方块组成,这些方块称为像素。每个像素都有自己的颜色和亮度值。
  2. 颜色模式:图像的颜色模式通常有三种:
    • 灰度图像:每个像素只有一个灰度值(0-255),代表黑白色调。
    • RGB图像:由红、绿、蓝三个通道组成,每个通道的像素值表示颜色的浓度。
    • 二值图像:每个像素只有两个值,0(黑色)和255(白色)。
      在这里插入图片描述

三、OpenCV基础功能

1. 读取和显示图像

cv2.imread() 用于读取图像,cv2.imshow() 用于显示图像,cv2.imwrite() 用于保存图像。

import cv2# 读取图像
image = cv2.imread("image.jpg")# 显示图像
cv2.imshow("Image", image)
cv2.waitKey(0)  # 等待用户按键关闭窗口
cv2.destroyAllWindows()  # 关闭窗口

2. 图像的缩放与调整大小

cv2.resize() 函数可以用来调整图像大小。

resized_image = cv2.resize(image, (300, 300))  # 将图像调整为300x300大小
cv2.imshow("Resized Image", resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 图像的旋转

cv2.getRotationMatrix2D()cv2.warpAffine() 函数可以实现图像旋转。

(h, w) = image.shape[:2]
center = (w // 2, h // 2)
matrix = cv2.getRotationMatrix2D(center, 45, 1.0)  # 旋转45度
rotated = cv2.warpAffine(image, matrix, (w, h))
cv2.imshow("Rotated Image", rotated)
cv2.waitKey(0)
cv2.destroyAllWindows()

4. 图像的裁剪

裁剪是指截取图像的某一部分。可以通过切片操作直接实现。

cropped = image[50:200, 50:200]  # 截取从(50, 50)到(200, 200)的区域
cv2.imshow("Cropped Image", cropped)
cv2.waitKey(0)
cv2.destroyAllWindows()

5. 图像的颜色转换

OpenCV 支持多种颜色空间的转换。常用的转换包括 BGR 到灰度、BGR 到 HSV 等。

# 转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("Gray Image", gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

6. 边缘检测

边缘检测是图像处理中常见的一项操作。cv2.Canny() 提供了高效的边缘检测方法。

edges = cv2.Canny(gray_image, 100, 200)  # 阈值范围为100到200
cv2.imshow("Edges", edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

7. 图像的模糊处理

模糊处理通常用于降噪或实现特效。OpenCV 提供了多种模糊方法,如均值模糊、Gaussian模糊和中值模糊。

blurred = cv2.GaussianBlur(image, (15, 15), 0)
cv2.imshow("Blurred Image", blurred)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

四、图像处理综合应用案例

案例:图像美化与滤镜效果

我们将创建一个简单的图像美化程序,该程序包括亮度调整、对比度增强、锐化处理、边缘增强等步骤,并展示如何利用 OpenCV 实现一款滤镜效果。

第一步:图像的亮度与对比度调整

亮度和对比度是控制图像视觉效果的关键参数。

def adjust_brightness_contrast(image, brightness=30, contrast=50):brightness = brightness / 100.0contrast = contrast / 100.0return cv2.convertScaleAbs(image, alpha=1 + contrast, beta=brightness * 255)brightened_image = adjust_brightness_contrast(image, brightness=30, contrast=50)
cv2.imshow("Brightened Image", brightened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
第二步:图像的锐化处理

锐化用于提高图像的清晰度。可以通过卷积操作实现。

kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
sharpened_image = cv2.filter2D(image, -1, kernel)
cv2.imshow("Sharpened Image", sharpened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
第三步:添加边缘增强效果

边缘增强可以通过 Sobel 滤波器或 Laplacian 滤波器实现。

laplacian = cv2.Laplacian(image, cv2.CV_64F)
edge_enhanced_image = cv2.convertScaleAbs(laplacian)
cv2.imshow("Edge Enhanced Image", edge_enhanced_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
第四步:综合滤镜效果

接下来我们将多个效果结合起来,创建一个滤镜效果函数。

def apply_filter(image):# 1. 调整亮度和对比度bright_contrast = adjust_brightness_contrast(image, brightness=20, contrast=40)# 2. 模糊处理blurred = cv2.GaussianBlur(bright_contrast, (5, 5), 0)# 3. 锐化处理kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])sharpened = cv2.filter2D(blurred, -1, kernel)# 4. 边缘增强laplacian = cv2.Laplacian(sharpened, cv2.CV_64F)edge_enhanced = cv2.convertScaleAbs(laplacian)return edge_enhancedfiltered_image = apply_filter(image)
cv2.imshow("Filtered Image", filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

通过这种方式,我们可以快速为图像添加自定义的滤镜效果。
在这里插入图片描述

五、实战项目:摄像头实时滤镜应用

现在让我们将所学知识应用于一个完整的实战项目:创建一个实时滤镜应用,使用电脑的摄像头捕捉画面并实时显示滤镜效果。

实战步骤

  1. 打开摄像头:使用 cv2.VideoCapture(0) 打开默认摄像头。
  2. 实时捕捉图像:通过循环不断读取摄像头的画面。
  3. 应用滤镜效果:对每一帧应用滤镜效果。
  4. 显示实时滤镜效果:显示实时滤镜后的画面。

实战代码

import cv2
import numpy as npdef apply_filter(image):# 调整亮度和对比度bright_contrast = adjust_brightness_contrast(image, brightness=20, contrast=40)# 模糊blurred = cv2.GaussianBlur(bright_contrast, (5, 5), 0)# 锐化kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])sharpened = cv2.filter2D(blurred, -1, kernel)# 边缘增强laplacian = cv2.Laplacian(sharpened, cv2.CV_64F)edge_enhanced = cv2.convertScaleAbs(laplacian)return edge_enhanceddef adjust_brightness_contrast(image, brightness=30, contrast=50):brightness = brightness / 100.0contrast = contrast / 100.0return cv2.convertScaleAbs(image, alpha=1 + contrast, beta=brightness * 255)cap = cv2.VideoCapture(0)  # 打开摄像头while True:ret, frame = cap.read()  # 捕捉视频中的一帧if not ret:break# 应用滤镜效果filtered_frame = apply_filter(frame)# 显示原始和滤镜效果画面cv2.imshow("Original", frame)cv2.imshow("Filtered", filtered_frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()

项目总结

该实战项目展示了如何结合 OpenCV 和实时视频处理技术,为摄像头捕捉的画面应用滤镜效果。你可以根据需要进一步自定义滤镜效果,例如添加彩色滤镜、卡通化效果等。
在这里插入图片描述

总结

OpenCV 是一个强大的图像处理库,支持各种图像和视频的操作。从基础的图像读取、显示,到高级的边缘检测、模糊处理和滤镜应用,OpenCV 提供了全面的支持。在本文中,我们学习了 OpenCV 的基本功能,并通过一个实时滤镜应用的实战项目,演示了 OpenCV 在图像处理和计算机视觉中的应用。希望这篇文章能为你打开计算机视觉的大门,激发你在图像处理领域进一步探索的兴趣!
在这里插入图片描述

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

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

相关文章

万字长文详解JavaScript基础语法--前端--前端样式--JavaWeb

🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 今天毛毛张带来的前端教程的第三期:JavaScript 文章目录 4.JavaScript4.1 JS简介4.1.1 JS起源4.1.2 JS 组成部分4.1.3 JS的引入方式 4.2 JS的数据类型和运…

医学图像算法之基于Unet的视网膜血管分割

第一步:准备数据 视网膜血管分割数据比较少,但效果好,总共40张 第二步:搭建模型 UNet主要贡献是在U型结构上,该结构可以使它使用更少的训练图片的同时,且分割的准确度也不会差,UNet的网络结构…

深度剖析JUC中LongAdder类源码

文章目录 1.诞生背景2.LongAdder核心思想3.底层实现:4.额外补充 1.诞生背景 LongAdder是JDK8新增的一个原子操作类,和AtomicLong扮演者同样的角色,由于采用AtomicLong 保证多线程数据同步,高并发场景下会导致大量线程同时竞争更新…

Python(PySimpleGUI 库)

PySimpleGUI 是一个用于简化 GUI 编程的 Python 包,它封装了多种底层 GUI 框架(如 tkinter、Qt、WxPython 等),提供了简单易用的 API。PySimpleGUI 包含了大量的控件(也称为小部件或组件),这些控…

LangChain学习心得总结

大模型开发遇到的问题及langchain框架学习 背景: 1、微场景间跳转问题,无法实现微场景随意穿插 2、大模型幻读(推荐不存在的产品、自己发挥) 3、知识库检索,语义匹配效果较差,匹配出的结果和客户表述的…

Linux基础(十二)——文件与文件系统的压缩、打包和备份

文件与文件系统的压缩、打包和备份 1.压缩1.1 压缩方法及其后缀1.2 gzip1.3 bzip21.4 xz 2.打包3.XFS文件系统备份与还原4.镜像文件创建(mkisofs) 1.压缩 1.1 压缩方法及其后缀 我们知道在 Linux 下面的扩展名是没有什么很特殊的意义的, 不…

简简单单的UDP

前言 上一篇了解了TCP的三次握手过程,目的、以及如何保证可靠性、序列号与ACK的作用,最后离开的时候四次挥手的内容,这还只是TCP内容中的冰山一角,是不是觉得TCP这个协议非常复杂,这一篇我们来了解下传输层另外一个协…

MLMs之OmniGen:OmniGen(统一图像生成模型)的简介、安装和使用方法、案例应用之详细攻略

MLMs之OmniGen:OmniGen(统一图像生成模型)的简介、安装和使用方法、案例应用之详细攻略 导读:这篇论文介绍了OmniGen,一个用于统一图像生成的扩散模型。论文的核心要点可以总结如下: >> 背景痛点: ● 图像生成领…

LeetCode 143.重排链表

题目: 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为: L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值,而是需要实际…

Linux进程信号(信号的产生)

目录 什么是信号? 信号的产生 信号产生方式1:键盘 前台进程 后台进程 查看信号 signal系统调用 案例 理解进程记录信号 软件层面 硬件层面 信号产生方式2:指令 信号产生方式3:系统调用 kill系统调用 案例 其他产生信号的函数调用 1.rais…

【C++】STL— stack的常见用法和模拟实现

目录 1、stack的介绍 2、stack的使用 构造一个空栈 stack的简单接口应用 3、stack的模拟实现 4、栈的相关题目 4.1 最小栈 4.1.2思路 4.1.3 实现代码 4.2 栈的压入、弹出序列 4.2.2 思路 4.2.3程序实现 1、stack的介绍 在C中,stack是一种标准模板库&am…

神书《从零构建大模型》分享,尚未发布,GitHub标星22k!!

《从零构建大模型》是一本即将于今年10月底发布的书籍,github已经吸引了惊人的21.7k标星!作者是威斯康星大学麦迪逊分校的终身教授,在GitHub、油管、X上拥有大量粉丝,是一位真正的大佬。 本书免费获取地址 在本书中&#xff0…

【深度学习目标检测|YOLO算法2】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析...

【深度学习目标检测|YOLO算法2】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析… 【深度学习目标检测|YOLO算法2】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析… 文章目录 【深度学习目标检测|YOL…

动态避障-图扑自动寻路 3D 可视化

自动寻路是机器人导航的核心技术,其原理主要涉及机器人与环境之间的复杂信息交互与处理。在自动寻路过程中,机器人依靠先进的传感器系统,如高清摄像头、精密激光雷达和灵敏超声波装置,全方位感知周围环境。这些传感器能够实时捕捉…

Docker 镜像拉不动?自建 Docker Hub 加速站 解决镜像拉取失败

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 众所周知,6 月份的时候,Docker Hub 的镜像就已经无法正常拉取,那会随手用 Nginx 反代了一下 Docker Hub,建了个自用的镜像站,一直用到了 9 月份&…

RabbitMQ集群搭建

RabbitMQ集群搭建 1、RabbitMQ集群1.1、默认集群模式1.1.1、为什么集群不复制队列内容和状态到所有节点? 1.2、镜像集群模式 2、默认集群模式安装前准备2.1、准备3台机器2.2、启动三台机器2.3、使用xshell 连接三台机器2.4、服务器安装erlang和RabbitMQ2.5、修改三台机器的/et…

mysql-springboot netty-flink-kafka-spark(paimon)-minio

1、下载spark源码并编译 mkdir -p /home/bigdata && cd /home/bigdata wget https://archive.apache.org/dist/spark/spark-3.4.3/spark-3.4.3.tgz 解压文件 tar -zxf spark-3.4.3.tgz cd spark-3.4.3 wget https://raw.githubusercontent.com/apache/incubator-celeb…

系统安全第七次作业题目及答案

一、 1.RBAC0 RBAC1 RBAC2 RBAC3 2.属性 身份标识 3.接入访问控制 资源访问控制 网络端口和节点的访问控制 二、 1.B 2.A 3.ABE 4.BCD 5.ABC 三、 1. 答:基于属性的访问控制(ABAC)是通过对实体属性添加约束策略的方式实现主、客体之…

【GESP】C++一级真题练习(202312)luogu-B3922,小杨报数

GESP一级真题练习。为2023年12月一级认证真题。for循环和取余计算应用。 题目题解详见:https://www.coderli.com/gesp-1-luogu-b3922/ 【GESP】C一级真题练习(202312)luogu-B3922,小杨报数 | OneCoderGESP一级真题练习。为2023年12月一级认证真题。for…

国科大现代信息检索技术第一次作业

第一次作业 题目1:考虑以下文档 文档名内容文档1new home sales top forecasts文档2home prices rise in june文档3increase in home sales in june文档4july new home sales rise 1、画出文档集对应的词项-文档矩阵 文档1文档2文档3文档4forecasts1000home1111…