【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.mzph.cn/bicheng/60407.shtml

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

相关文章

【LeetCode】【算法】33. 搜索旋转排序数组

LeetCode 33. 搜索旋转排序数组 题目描述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k…

【C++】 list 与 string 基础与实现字符串操作

【C】使用 list 与 string 实现基础字符串操作 文章目录 一、字符串的基础操作1.1 - startsWith1.2 - endsWith1.3 - trim1.4 - indexOf1.5 - replaceAll 二、list 基础操作2.1 - 遍历2.1.1 - 使用迭代器访问2.1.2 - 使用基于范围的 for 循环遍历2.1.3 - 使用标准算法库遍历 2.…

ctfshow-web入门-反序列化(web260-web264)

目录 1、web260 2、web261 3、web262 4、web263 5、web264 1、web260 要求传入的内容序列化后包含指定内容即可&#xff0c;在 PHP 序列化中&#xff0c;如果键名或值包含 ctfshow_i_love_36D&#xff0c;那么整个序列化结果也会包含这个字符串。 payload&#xff1a; ?…

Python 爬虫运行状态监控:进度、错误与完成情况

Python 爬虫运行状态监控&#xff1a;进度、错误与完成情况 在进行大规模数据爬取时&#xff0c;监控爬虫的运行状态至关重要。通过实时监控&#xff0c;可以了解爬虫的工作进度、出现的错误以及任务完成情况。这样可以及时发现并解决问题&#xff0c;确保数据抓取任务顺利进行…

Flutter错误: uses-sdk:minSdkVersion 16 cannot be smaller than version 21 declared

前言 今天要做蓝牙通信的功能&#xff0c;我使用了flutter_reactive_ble这个库&#xff0c;但是在运行的时候发现一下错误 Launching lib/main.dart on AQM AL10 in debug mode... /Users/macbook/Desktop/test/flutter/my_app/android/app/src/debug/AndroidManifest.xml Err…

除了易我数据恢复,这10个数据恢复软件也能点亮数据找回的希望之光。

易我数据恢复工具具有广泛的系统兼容性&#xff0c;并且里面功能丰富&#xff0c;操作简单&#xff0c;能够完成多种数据恢复操作&#xff0c;是一款比较专业的数据恢复软件。如果大家在为数据丢失而烦恼的话&#xff0c;我可以推荐几款好用的数据恢复软件给大家。 1、福昕数据…

P8680 [蓝桥杯 2019 省 B] 特别数的和

题目描述 小明对数位中含有 2、0、1、9 的数字很感兴趣&#xff08;不包括前导 0&#xff09;&#xff0c;在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40&#xff0c;共 28 个&#xff0c;他们的和是 574。 请问&#xff0c;在 1 到 n 中&#xff0c;所有这样的数的…

Vue Cli 脚手架目录文件介绍

小试牛刀 //vetur高亮; vuetab 快速生成 <template><div class"box">我是个盒子<button click"fn">按钮</button></div> </template><script> export default {methods:{fn(){alert("Hello Vue")}} …

使用Matlab神经网络工具箱

在Matlab中&#xff0c;我们可以使用神经网络工具箱来创建和训练神经网络。以下是一些示例&#xff1a; 1.创建一个简单的神经网络并进行训练&#xff1a; 1.% 创建一个3个输入&#xff0c;2个隐藏节点&#xff0c;1个输出节点的神经网络 2.net feedforwardnet(10,10,train…

在公司中,如何表现出自己的高情商,学会这三句话就可以了

在职场中&#xff0c;高情商的重要性不言而喻。它能帮助你更好地处理人际关系&#xff0c;提升团队协作效率&#xff0c;还能让你在职场上获得更多的机会。 在职场中&#xff0c;适时地给予同事、上级和下属赞美、感谢和鼓励&#xff0c;能够拉近彼此的距离&#xff0c;增强团…

cache(五)Write-through,Write-back,Write-allocate,No-write-allocate

这张图总结了缓存系统中写操作策略的不同方法&#xff0c;主要讨论了在**写命中&#xff08;write-hit&#xff09;和写未命中&#xff08;write-miss&#xff09;**情况下应该采取的操作策略。 1. 多个数据副本的存在 缓存系统通常有多个级别&#xff0c;例如 L1 缓存、L2 缓…

商品规格递归拼接

创建实体类 Data public class Shopping {private String name;private List<String> children; } 测试 public static void main(String[] args) {ArrayList<Shopping> shoppings new ArrayList<>();Shopping shopping new Shopping();shopping.setName…

大模型基础: 从零开始训练一个最小化的Transformer聊天机器人

这里将介绍如何从零开始&#xff0c;使用Transformer模型训练一个最小化的聊天机器人。该流程将尽量简化&#xff0c;不依赖预训练模型&#xff0c;并手动实现关键步骤&#xff0c;确保每一步都容易理解。 1. 环境准备 首先&#xff0c;确保安装了必要的Python库。我们只需要基…

Android中寻找 package 包名

在 Android 应用开发中&#xff0c;AndroidManifest.xml 文件扮演着至关重要的角色。它不仅定义了应用的基本信息&#xff0c;如权限、组件声明等&#xff0c;还包含了一个非常重要的属性——package。本文将详细介绍 package 属性的作用及其与 Gradle 配置之间的关系。 packa…

推荐一款3D建模软件:Agisoft Metashape Pro

Agisoft Metashape Pro是一款强大的多视点三维建模设计辅助软件&#xff0c;Agisoft Metashape是一款独立的软件产品&#xff0c;可对数字图像进行摄影测量处理&#xff0c;并生成3D空间数据&#xff0c;用于GIS应用&#xff0c;文化遗产文档和视觉效果制作&#xff0c;以及间接…

Docker--Docker是什么和对Docker的了解

Docker 的本质 Docker的本质是LXC&#xff08;Linux容器&#xff09;之类的增强版&#xff0c;它本身不是容器&#xff0c;而是容器的易用工具。 Docker通过虚拟化技术&#xff0c;将代码、依赖项和运行环境打包成一个容器&#xff0c;并利用隔离机制来使得容器之间互相独立、…

前端请求后端php接口跨域 cors问题

只需要后端在网站的入口文件 一般都是 index.php 加上 这几行代码就可以了 具体的参数可以根据需要去修改 header("Access-Control-Allow-Origin: *"); header(Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS); header(Access-Control-Allow-Heade…

Wi-Fi背后的工作原理与技术发展历程介绍【无线通信小百科】

1个视频说清楚WIFI&#xff1a;频段/历程/技术参数/常用模块 智能手机拥有率越来越高的今天&#xff0c;大家已经习惯了通过无线网络上网的方式。除了在外面需要用手机流量&#xff0c;我们通常在家里或者机场&#xff0c;商场都可以通过Wi-Fi连接上网。本期文章将为大家介绍Wi…

【Linux】如何通过终端命令查看当前可用网络 WIFI + 设置已配置网络的连接优先级 + 连接/断连网络

【Linux】通过命令行&#xff0c;查看当前可用网络 WIFI 设置已配置网络的连接优先级 连接网络 列出所有可连接网络 nmcli device wifi list这个命令会列出所有可连接 wifi&#xff0c;*表示当前连接。 IN-USE BSSID SSID MODE CHAN …

HTMLCSS: 日落卡片

效果演示 这段代码创建了一个包含日落图像和文本的美观卡片&#xff0c;使用了现代CSS背景模糊和渐变&#xff0c;以及SVG图形来增强视觉效果。 HTML <div class"card"><div class"card__content"><div class"card-details">…