机器学习中的图像处理与计算机视觉

引言

在现代计算机科学中,图像处理计算机视觉已成为最活跃的研究领域之一,这得益于机器学习和深度学习的发展。本文将深入探讨图像处理与计算机视觉的基础概念、常见应用、关键技术、常用工具,以及在这些领域中的代码示例。通过本篇文章,我们将了解如何从头开始构建一个简单的计算机视觉系统,并探索这些技术背后的原理。

一、图像处理与计算机视觉简介

图像处理是通过计算机对图像进行操作,以改进图像质量或提取有用的信息。它通常包括对图像的滤波、增强、变换等操作。

计算机视觉旨在让计算机具备像人类一样理解图像的能力。它涵盖了从图像中提取特征、识别物体、进行图像分类、目标检测等广泛任务。它更多依赖于机器学习,尤其是深度学习来实现对图像和视频的理解。

二、图像处理与计算机视觉的应用场景

  1. 图像分类:例如将图像分类为猫、狗等不同类别。

  2. 物体检测与定位:识别图像中的多个物体及其在图像中的位置。

  3. 面部识别:用于人脸识别,应用于门禁、安防系统等。

  4. 自动驾驶:从图像中提取道路、障碍物等关键信息,用于导航。

  5. 医疗影像分析:对X光片、CT等影像进行处理,帮助医生诊断。

三、图像处理的基础操作

在图像处理领域,基础操作通常包括灰度化、滤波、边缘检测等。

1. 图像的灰度化

图像灰度化是将彩色图像转换为黑白(灰度)图像的过程。它可以简化后续的计算。

以下是利用Python中OpenCV库进行图像灰度化的代码示例:

import cv2
​
# 读取彩色图像
image = cv2.imread('sample.jpg')
​
# 将图像转换为灰度图
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
​
# 显示图像
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的代码中,我们使用了OpenCV的cvtColor()方法将BGR图像转换为灰度图。这个过程通过计算RGB的加权平均值来实现,将彩色信息转化为单通道的灰度值。

2. 图像滤波

滤波是去除噪声、增强图像特征的一个重要过程。常用滤波器包括高斯滤波、均值滤波、边缘增强滤波等。

以下代码展示了如何对图像进行高斯滤波:

# 进行高斯滤波
blurred_image = cv2.GaussianBlur(image, (5, 5), 0)
​
# 显示结果
cv2.imshow('Blurred Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 边缘检测

边缘检测是计算机视觉中一个重要步骤,通常用于检测图像中的显著边缘特征。最著名的边缘检测算法是Canny算法。

# Canny边缘检测
edges = cv2.Canny(gray_image, 100, 200)
​
# 显示结果
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的代码中,我们使用Canny边缘检测提取图像中的边缘信息。该方法采用双阈值技术,有助于增强边缘信息的检测效果。

四、深度学习与计算机视觉

深度学习,尤其是卷积神经网络(Convolutional Neural Network,CNN),是计算机视觉的核心技术。通过CNN模型,计算机可以从大量图像中学习特征,从而进行图像识别和分类。

1. 卷积神经网络的基本概念

卷积神经网络是通过卷积层池化层全连接层组合而成,用于提取图像特征并进行分类。

  • 卷积层:用于提取图像中的特征。

  • 池化层:用于降低特征图的维度,减少计算量。

  • 全连接层:对特征进行组合,最终输出分类结果。

2. 实现手写数字识别

在这一部分,我们将利用深度学习框架(如TensorFlow和Keras)来训练一个卷积神经网络,以实现手写数字的识别。

import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt
​
# 加载MNIST数据集
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()
​
# 数据预处理
train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255
​
# 搭建CNN模型
model = models.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.Flatten(),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')
])
​
# 编译模型
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
​
# 训练模型
model.fit(train_images, train_labels, epochs=5, validation_data=(test_images, test_labels))
​
# 评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f"Test accuracy: {test_acc}")

3. 代码解读

  • 加载数据集:我们使用了经典的MNIST手写数字数据集,这个数据集包含60000张训练图片和10000张测试图片。

  • 卷积神经网络结构:网络中包含多个卷积层、池化层和全连接层,最终输出10个类别,代表数字0-9。

  • 训练与评估:模型使用adam优化器和交叉熵损失函数进行训练,并通过验证集评估模型的准确性。

五、计算机视觉中的常用技术

1. 目标检测

目标检测是计算机视觉中的一个关键任务,用于检测图像中的多个对象并标注其位置。经典的目标检测算法包括YOLO(You Only Look Once)和R-CNN系列。

以下是利用OpenCV和预训练的YOLOv3模型进行目标检测的代码示例:

import cv2
import numpy as np
​
# 加载YOLO模型的配置和权重文件
net = cv2.dnn.readNet('yolov3.weights', 'yolov3.cfg')
​
# 加载类名(COCO数据集中的80种类)
with open('coco.names', 'r') as f:
    classes = [line.strip() for line in f.readlines()]
​
# 读取输入图像
image = cv2.imread('street.jpg')
height, width, _ = image.shape
​
# 创建YOLO的输入blob
blob = cv2.dnn.blobFromImage(image, scalefactor=0.00392, size=(416, 416), swapRB=True, crop=False)
net.setInput(blob)
​
# 获取YOLO网络的输出层
output_layers = net.getUnconnectedOutLayersNames()
layer_outputs = net.forward(output_layers)
​
# 处理输出,获取边界框、类名和置信度
boxes, confidences, class_ids = [], [], []
for output in layer_outputs:
    for detection in output:
        scores = detection[5:]
        class_id = np.argmax(scores)
        confidence = scores[class_id]
        if confidence > 0.5:
            center_x, center_y, w, h = (detection[0:4] * [width, height, width, height]).astype('int')
            x = int(center_x - w / 2)
            y = int(center_y - h / 2)
            boxes.append([x, y, w, h])
            confidences.append(float(confidence))
            class_ids.append(class_id)
​
# 进行非最大值抑制以去除重叠框
indices = cv2.dnn.NMSBoxes(boxes, confidences, score_threshold=0.5, nms_threshold=0.4)
​
# 绘制检测结果
for i in indices.flatten():
    x, y, w, h = boxes[i]
    label = f"{classes[class_ids[i]]}: {confidences[i]:.2f}"
    color = (0, 255, 0)
    cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)
    cv2.putText(image, label, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
​
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这段代码中,我们使用了YOLOv3的预训练模型对图像进行目标检测,能够识别街道场景中的人、车等对象,并标注其位置。

六、常用工具与库

在图像处理与计算机视觉的领域中,有一些非常常用的工具与库可以极大地提高开发效率:

  1. OpenCV:一个开源的计算机视觉库,提供了丰富的图像处理功能,适合初学者和工程实现。

  2. TensorFlow/Keras:用于构建和训练深度学习模型,特别适合计算机视觉任务。

  3. PyTorch:一个动态深度学习框架,适用于研究和开发计算机视觉项目。

  4. scikit-image:Python中的图像处理库,提供了各种基础图像处理操作。

七、总结

图像处理与计算机视觉是一个不断发展的领域,深度学习的加入使其能力得到了极大的提升。从基本的图像处理到使用深度学习实现复杂的目标检测,计算机视觉技术正在深刻地改变我们的生活。从识别交通标志到诊断医学影像,这些技术为自动化和智能化提供了无穷的可能性。

通过本文,我们学习了图像处理的基础知识、卷积神经网络的基础、深度学习在图像分类和目标检测中的应用,以及一些实践中的代码示例。希望这些内容能激发你对计算机视觉的兴趣,并帮助你在这个令人激动的领域中走得更远。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

约80%的巴西消费者热捧跨境电商平台Shopee

巴西作为南美洲最大的经济体,拥有庞大的消费群体和日益增长的消费需求。随着互联网的普及和电子商务的快速发展,巴西消费者对海外商品的兴趣日益浓厚。他们渴望获得更多元化的商品选择,尤其是那些在国内难以找到的特色商品或国际知名品牌。这…

Python3 接口自动化测试,HTTPS下载文件(GET方法和POST方法)

Python3 接口自动化测试,HTTPS下载文件(GET方法和POST方法) requests-pkcs12 PyPI python中如何使用requests模块下载文件并获取进度提示 1、GET方法 1.1、调用 # 下载客户端(GET)def download_client_get(self, header_all):try:url = self.host + "/xxx/v1/xxx-mod…

DBdoctor推出无Agent轻量级纳管解决方案

目录 背景 DBdoctor推出无Agent轻量级纳管解决方案 方案优势: 实例纳管方式: 无Agent纳管可体验哪些功能? 1.全量SQL审核功能 2.实例巡检功能 3.性能洞察功能 4.基础监控功能 总结 背景 在数字化时代,数据库作为信息系…

前端拦截302重定向

背景: 根据业务场景需要拦截302做后续的逻辑处理 尝试一: : axios拦截 、、、、、async created() {// 获取302请求返回的location后手动修改video的src路径let targetSrc;try {await axios.get(this.video).then((res) > {const { headers, status } res;const { locat…

unity 屏幕波动反馈打击效果(附资源下载)

unity 屏幕波动反馈打击效果 一枪打出去整个屏幕都回波动的效果反馈。 知识点: 1、动画事件 2、屏幕后处理 效果如图:(波动速度浮动都可调整) 附件下载

[C#][winform]基于yolov8的DMS驾驶员抽烟打电话喝水吃东西检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面

【重要说明】 该系统以opencvsharp作图像处理,onnxruntime做推理引擎,使用CPU进行推理,适合有显卡或者没有显卡windows x64系统均可,不支持macOS和Linux系统,不支持x86的windows操作系统。由于采用CPU推理,要比GPU慢。…

EWM 库存盘点

目录 1 业务流程图 2 后台配置 & 主数据 3 业务操作 1 流程图 2 后台配置 & 主数据 仓库活动区域设置 SCM Extended Warehouse Management -> Extended Warehouse Management -> Internal Warehouse Processes -> Physical Inventory -> Physical-Inv…

k8s-pod详解

Pod生命周期 我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期,它主要包含下面的过程 pod创建过程 运行初始化容器(init container)过程 运行主容器(main container) 容器启动后钩子(post st…

C语言【调试】(个人笔记版)

调试 前言一、Bug二、调试工具1.DeBug2.Release 三、调试快捷键1、断点 四、调试时查看程序的当前信息1、查看临时变量2、查看内存3、查看调用堆栈、汇编、寄存器 总结 前言 这篇文章大都是我的个人笔记: 调试在日常程序设计中是很重要的。调试说白了就是为了解决代…

zookeeper客户端

启动单机版的zookeeper 配置Maven环境 (1) IDEA自带maven (2) 更新Maven库镜像地址: ① 拷贝D:\Program Files\JetBrains\IntelliJ IDEA 2018.3.5\plugins\maven\lib\maven3\conf\settings.xml [IntelliJ的安装目录]到 C:/用户/username/.m2 (如果.m2文件不存在&…

大话哈希冲突

Map是很常用的数据结构, 而哈希表是 HashMap 等集合的底层实现之一,它通过将键的哈希值映射到数组中的位置来存储键值对。哈希冲突 (Hash Collision) 是指在使用哈希函数将数据映射到有限大小的哈希表时,不同的数据项被映射到了同一个哈希表位置上。 一…

【C++】拆分详解 - stack和queue

文章目录 一、stack的介绍和使用1. 简介2. 使用3. 模拟实现 二、queue的介绍和使用1. 简介2. 使用3. 模拟实现 三、容器适配器1. 简介2. STL标准库中的使用 四、deque(了解)1. 简介2. 底层原理2.1 底层空间2.2 模拟访问元素2.3 迭代器2.4 STL源码片段摘要…

高清无水印推文视频素材下载网站推荐

在制作抖音短视频时,选择合适的视频素材至关重要。想知道哪里可以下载热门的推文视频素材吗?别担心,我为你整理了六个高品质的视频素材网站,让我们一起来看看吧! 蛙学网 首先介绍的是蛙学网,作为国内知名的…

期权懂|股票下跌时可以使用期权止损吗?

本期让我懂 你就懂的期权懂带大家来了解,股票下跌时可以使用期权止损吗?有兴趣的朋友可以看一下。期权小懂每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 股票下跌时可以使用期权止损吗? 在股市中&am…

Oracle 使用位图索引 Cost降低200倍! 探讨位图索引的利与弊

一.简介 位图索引(Bitmap Index) 是 Oracle 数据库中一种特殊类型的索引,适用于低基数(Low Cardinality)列,即那些列中可选值相对较少的情况下使用。它与常规的 B-tree 索引不同,位图索引通过位…

MybatisPlus入门教程及实现基础的增删改查

此篇博客主要针对于有开发基础的朋友学习~ 首先提几个问题: 1、什么是Mybatis? 2、什么是MybatisPlus? 3、Mybatis和MybatisPlus又有什么区别呢? 问题1:Mybatis是一个持久层的框架,我们通过配置mapper.xm…

Linux 外设驱动 应用 2 KEY 按键实验

2 按键 2.1 按键介绍 按键是指轻触式按键开关,也称之为轻触开关。按键开关是一种电子开关,属于电子元器件类,最早出现在日本,称之为:敏感型开关,使用时以满足操作力的条件向开关操作方向施压开关功能闭合…

RabbitMQ系列学习笔记(三)--工作队列模式

文章目录 一、工作队列模式原理二、工作队列模式实战1、抽取工具类2、消费者代码3、生产者代码4、查看运行结果 本文参考 尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq RabbitMQ 详解 Centos7环境安装Erlang、RabbitMQ详细过程(配图) 一、工作队列模式原理 与简单模式相…

MySQL中查询语句的执行流程

文章目录 前言流程图概述最后 前言 你好,我是醉墨居士,今天我们一起探讨一下执行一条查询的SQL语句在MySQL内部都发生了什么,让你对MySQL内部的架构具备一个宏观上的了解 流程图 概述 对于查询语句的SQL的执行流程,主要可以分为…

架构师备考-背诵精华(系统架构评估)

系统架构评估是在对架构分析、评估的基础上,对架构策略的选取进行决策。它利用数学或逻辑分析技术,针对系统的一致性、正确性、质量属性、规划结果等不同方面,提供描述性、预测性和指令性的分析结果。 重要概念 敏感点:敏感点是…