【课程总结】Day8(下):计算机视觉基础入门

news2025/1/13 10:35:25

前言

数据结构

在人工智能领域,机器可以处理的数据类型如上图,大约可以分为以上类别。其中较为常用的数据类别有:

表格类数据

  • 数据特点:
    • 成行成列:一行一个样本,一列一个特征
    • 特征之间相互独立,互不影响
  • 解决办法:
    • 机器学习算法
    • 深度学习(全连接网络)

时序类数据 sequential data:

  • 数据特点:
    • 一维信号:在一个方向上,不能随便改变顺序
    • 特征之间存在某种前后依赖关系
    • 特征之间不是相互独立
  • 数据举例:
  • 自然语言:“我打你"和"你打我”,词是一样的,但是有先后顺序,表达的意思是不一样的

  • 股票

  • 声音

  • 音乐

  • 解决办法:
    • 循环申请网络
    • RNN
    • transformer

图像类数据 image data

  • 数据特点:

    • 二维信号:在两个方向上,不能随意改变顺序
  • 数据举例:

    • 相机拍摄

    • 红外线成像

    • 雷达成像

    • X光成像

图像数据操作

读取方式

使用opencv读取图片
import cv2
# 读取图像
img = cv2.imread('./beauty.png', 1)


print(type(img))
# [H, W, C]
# H: Height 高度
# W: Width 宽度
# C: Channel 通道数
# OpenCV通道排布:BGR模式
# Matplotlib通道排布:RGB模式
print(img.shape)

# 显示图像
cv2.imshow('image', mat=img)

# 等待键盘输入
cv2.waitKey(delay=3000)

  1. 如果未安装opencv,需要访问pypi.org,搜索opencv-python获取安装命令。
  2. 安装命令一般为:pip install opencv-python
  3. 如果有多个Python环境,需要注意安装时运行的命令行,详情请见pip安装常见问题
使用matplotlib读取图片
from matplotlib import pyplot as plt
import numpy as np

# 读取图像
img = plt.imread('beauty.png')

print(type(img))
print(img.shape)
print(img.size)

# 显示图像
plt.imshow(img)

# 显示结果
plt.show()

使用PIL读取图片
from PIL import Image

# 读取图像
img = Image.open('beauty.png')

# 显示图像
img.show()
三种库的对比
优点缺点适用场景
OpenCV- 专门用于计算机视觉任务
- 速度快
- 支持多种图像格式的读取和保存
- 对于简单的图像显示功能不如 Matplotlib- 实时图像处理、视频处理、计算机视觉任务
Matplotlib- 强大的绘图库
- 支持各种图形绘制
- 方便进行图像的展示、分析和可视化
- 图像处理和操作功能相对较少,不如 OpenCV- 数据可视化、图像展示、简单图像处理
PIL(Pillow)- 提供丰富的图像处理功能
- 支持图像的打开、保存、剪裁、旋转等操作
- 方便进行图像处理和转换
- 对于复杂的计算机视觉任务功能不如 OpenCV- 图像处理、图像编辑、简单图像识别

滤波处理

均值滤波

先运行一段代码,查看图片显示效果

import cv2
import numpy as np

# 读取图像
img = cv2.imread('beauty.png')

# 不同的 N 值
kernel_sizes = [3, 5, 7, 11, 15]

# 处理不同的 N 值情况
for N in kernel_sizes:
    # 创建均值滤波核
    kernel = np.ones((N, N)) / N**2
    img_filtered = cv2.filter2D(src=img, ddepth=-1, kernel=kernel)
    
    # 显示图像
    cv2.imshow(f'Filtered Image N={N}', img_filtered)

# 等待键盘输入和关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

可以看到图片从左向右依次变得模糊,这是因为代码中对图像进行了滤波处理。

  • 定义:图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。

  • 原理:

    以均值滤波为例:

    1、原图与一个给定的模板(例如3×3),进行两个矩阵点乘之后再相加。

    2、然后依次向右移动一列,重复1步骤的计算,直到达到图片的右侧边界之后,再向下一行。

    以上操作即为卷积操作。

自定义卷积核

我们定义了一个卷积核如下:

kernel = np.array([[-1,-1,-1],[0,0,0],[1,1,1]])
# 相当于如下3×3的矩阵
# 卷积核的中间行为零,第一行为负数,第二行为正数。
# [-1, -1, -1]
# [0 , 0 , 0 ]
# [1 , 1 , 1 ]

这样可以突出图像中垂直方向像素有突变的情况。运行结果如下:

如果像素相同,经过上面卷积核的运算就会上下像素抵消为0,变成黑色;

如果像素不同,经过上面卷积核的运算就会把差异放大抽取出来,从而凸显出像素的突变。

如果我们把卷积核转置一下:

kernel = np.array([[-1,-1,-1],[0,0,0],[1,1,1]])
kernel = kernel.T
# 相当于如下3×3的矩阵
# [-1, 0 , 1 ]
# [-1, 0 , 1 ]
# [-1, 0 , 1 ]

这样可以突出图像中水平方向像素有突变的情况,运行结果如下:

如果我们把卷积核变为如下方式:

kernel = np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])
# 相当于如下3×3的矩阵
# [-1, -1, -1 ]
# [-1,  8, -1 ]
# [-1, -1, -1 ]

运行结果如下:

上述图像中会对上下左右的条纹都进行抽取。

以上方法,在传统的图片处理过程中,常常用于获得图片的轮廓。

卷积操作

传统图像处理的卷积操作与神经网络中的卷积操作,大体情况如下:

  • 原理是类似的,都是使用一个核,然后逐行逐列的进行矩阵运算。

  • 传统图像处理中,卷积核是由工程师自己设计的;在神经网络中,这些工作都交给程序实现,不需要人参与。

    我们通过pytorch的Conv2d来实现一个卷积,代码如下:

import torch
import torch.nn as nn
import torchvision.transforms as transforms
from PIL import Image
import matplotlib.pyplot as plt


# 读取图像并转换为 PyTorch Tensor
img = Image.open('beauty.png').convert('L')  # 以灰度模式打开图像
transform = transforms.ToTensor()
img_tensor = transform(img).unsqueeze(0)  # 添加 batch 维度

# 定义卷积层
conv_layer = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=3, padding=1, bias=False) 
"""
	in_channels:输入特征图的通道数。
	out_channels:输出特征图的通道。
	kernel_size:卷积核的大小,一般是3×3。
	stride:卷积核每次移动的步长,默认为1。
	padding:图像填充,可以是一个整数。
	dilation:膨胀卷积/空洞卷积,卷积核元素之间的间距,控制卷积核的采样间距。
	groups:分组卷积的组数,默认值为1。当 groups 大于1时,输入和输出的通道数必须可以被 groups 整除
	bias:是否包含偏置项,默认为True。如果设置为False,则卷积层不包含偏置项。
	padding_mode:填充方式,一般默认填充为0。由于信息储存在相对大小中,所有填充不影响原始内容的信息。
	device:是否使用GPU
"""

# 执行卷积操作(不进行滤波)
output = conv_layer(img_tensor)

# 将输出转换为 PIL 图像
output_img = transforms.ToPILImage()(output.squeeze(0))

# 显示原始图像和卷积后图像
plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)
plt.imshow(img, cmap='gray')
plt.title('Original Image')
plt.axis('off')

plt.subplot(1, 2, 2)
plt.imshow(output_img, cmap='gray')
plt.title('Convolved Image')
plt.axis('off')

plt.show()

运行结果:

内容小结

  • 人工智能领域处理的数据,总体概括来说有三类数据:表格类、时序类、图像类
  • 图像数据处理的库有三种,opencv、matplotlib、PIL,它们各自有其优缺点和适用场景
  • 图像的卷积原理,使用一个卷积核与原图进行像素点的相乘再相加计算,从而找到图像的轮廓
  • 传统图像处理时需要工程师自己设计卷积核,在神经网络已交给计算机处理

参考资料

计算机视觉基础-图像滤波

均值滤波图 均值滤波3×3

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

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

相关文章

最实用的AI软件开发工具CodeFlying测评

就在上个月,OpenAI宣布GPT-4o支持免费试用,调用API价格降到5美元/百万token。 谷歌在得到消息后立马将Gemini 1.5 的价格下降到0.35美元/百万token。 Anthropic的API价格,直接干到了0.25美元/百万token。 国外尚且如此,那么国内…

科技赋能,避震婴儿车或成为行业硬通货

全球知识经济发展发展到今天,消费者对于品质、服务、体验的要求越来越高,与之对应的产品也就越来越科技化、智能化、个性化,品牌化和差异化逐步成为产品的竞争核心。 婴儿推车作为关系婴幼儿出行安全的支柱性产业之一,从车架结构…

分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了

前言 实际上,.NET Core 内部也内置了一套日志系统,它是一个轻量级的日志框架,用于记录应用程序的日志信息。 它提供了 ILogger 接口和 ILoggerProvider 接口,以及一组内置的日志提供程序(如 Console、Debug、EventSo…

STM32-17-DAC

STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 STM32-13-MPU STM32-14-FSMC_LCD STM32-15-DMA…

uni-ui:基于uni-app的全端兼容高性能UI框架

一、引言 在移动应用开发领域,跨平台框架因其能够降低开发成本、提高开发效率而备受开发者青睐。其中,uni-app作为一个使用Vue.js开发所有前端应用的框架,不仅支持编译到iOS、Android、H5、以及各种小程序等多个平台,还因其丰富的…

实现开发板三盏灯点亮熄灭

实现开发板三盏灯点亮熄灭 typedef struct {volatile unsigned int MODER; // 0x00volatile unsigned int OTYPER; // 0x04volatile unsigned int OSPEEDR; // 0x08volatile unsigned int PUPDR; // 0x0Cvolatile unsigned int IDR; // 0x10volatile unsigned int OD…

无线网络与物联网技术[1]之近距离无线通信技术

无线网络与物联网技术 近距离无线通信技术WIFIWi-Fi的协议标准Wi-Fi的信道Wi-Fi技术的术语Wi-Fi的组网技术Ad-hoc模式无线接入点-APAP:FAT AP vs FIT AP Wi-Fi的特点与应用Wi-Fi的安全技术 Bluetooth蓝牙技术概论蓝牙的技术协议蓝牙的组网技术微微网piconet(了解)散…

C#聊天室①

聊天室服务器: 创建项目 桌面不需要使用控件 Program.cs internal class Program {static TcpListener server;[STAThread]static void Main(){Program p new Program(); p.start();}void start(){server new TcpListener(IPAddress.Parse(GetIP()), 33…

58.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露(6)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:57.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露(5)-CSDN博客…

模拟笔试 - 卡码网周赛第二十一期(23年美团笔试真题)

第一题:小美的排列询问 解题思路: 简单题,一次遍历数组,判断 是否有和x、y相等并且相连 即可。 可优化逻辑:因为x和y是后输入的,必须存储整个数组,但是上面说了 **排列是指一个长度为n的数组&#xff0…

学习笔记——网络管理与运维——概述(网络管理)

二、概述 1、什么是网络管理? 网络管理是通过对网络中设备的管理,保证设备工作正常,使通信网络正常地运行,以提供高效、可靠和安全的通信服务,是通信网络生命周期中的重要一环。 2、网络管理分类 网络管理(Network …

C++ 24 之 拷贝构造函数

c24拷贝构造函数.cpp #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std;class Person3 { private:int p_age; public:// 构造函数分类&#xff1a;// 按参数分类&#xff1a;1、有参 2、无参// 按类型分类:普通、拷贝&#xff08;复制&…

Charles代理https接口到本地

一、操作手册 1、安装工具 1.1、安装代理软件Charles 软件下载地址&#xff1a;Download a Free Trial of Charles • Charles Web Debugging Proxy 1.2、安装https代理插件&#xff1a;&#xff08;有问题自行百度解决&#xff09; 2、配置策略 以下以https接口为例&…

型号设计师和指挥调度体系: 中国航天系统工程的组织方式

在中国航天&#xff0c;系统工程的组织管理体系是设计师系统和指挥调度系统。 型号设计师系统是型号的技术体系&#xff0c;总设计师是研制任务的技术总负责人&#xff0c;是设计技术方面的组织者、指挥者&#xff0c;重大技术问题的决策者。 指挥调度系统是型号行政管理系统…

C++switch陈述

C 使用关键字 switch、case、default对一个常数执行不同的分流&#xff0c;这构成多重选择的结构&#xff0c;形式如下 简单来说&#xff0c;switch后头接一小括弧&#xff0c;小括弧内为一常数运算式&#xff0c;计算出常数值若与其后case的位标(label) 相符&#xff0c;就会执…

文件没有权限问题:cannot create /opt/apollo/neo/data/log/monitor.log: Permission denied

问题描述 执行 aem bootstrap start --plus 命令启动 Dreamview 提示错误&#xff1a; /bin/sh: 1: cannot create /opt/apollo/neo/data/log/monitor.log: Permission denied [ERROR] Failed to start Dreamview. Please check /opt/apollo/neo/data/log/dreamview.log or /op…

Windows环境RocketMQ启动broker时启动失败

在输入”start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnabletrue“命令启动失败后&#xff0c;会出现如下图所示的样子。 但我们重新启动电脑、重新启动RocketMQ或者杀死进程等方法都对此无效&#xff0c;还是没有启动成功。 启动失败的原因&#xff1a; 中途断网或…

Kaggle -- Multi-Class Prediction of Obesity Risk

使用简单的决策树进行分类&#xff0c;代码如下&#xff1a; import pandas as pd import numpy as np from sklearn.preprocessing import OneHotEncoder from sklearn.model_selection import train_test_splitdf pd.read_csv("train.csv")df[Gender] df[Gender…

React 中的 Lanes

React 中有一个 Lane 的概念&#xff0c;Lane 就像高速路上的不同车道&#xff0c;具有不同优先级&#xff0c;在 React Lane 通过一个 32 位的二进制数来表示。越小优先级别越高&#xff0c;SyncLane 级别最高。用二进制存储的方式&#xff0c;可以通过逻辑操作快速判断 Lane …

vite.config.js如何使用env的环境变量

了解下环境变量在vite中 官方文档走起 https://cn.vitejs.dev/guide/env-and-mode.html#env-variables-and-modes 你见到的.env,.env.production等就是放置环境变量的 官方文档说到.env.[mode] # 只在指定模式下加载,比如.env.development只在开发环境加载 至于为什么是deve…