Python图像处理——计算机视觉中常用的图像预处理
概述
在计算机视觉项目中,使用样本时经常会遇到图像样本不统一的问题,比如图像质量,并非所有的图像都具有相同的质量水平。在开始训练模型或运行算法之前,通常需要对图像进行预处理,以确保获得最佳的结果。图像预处理包括调整大小和裁剪到降噪和归一化的各种技术。涉及的库有OpenCV、Pillow和scikit-image等。
图像预处理
图像预处理是将原始图像数据操作成可用和有意义格式的过程。它允许消除不希望的失真并增强计算机视觉应用所需的特定品质。预处理是准备图像数据输入到机器学习模型之前的重要步骤。
常用的图像预处理:
-
调整大小: 将图像调整到统一的大小对机器学习算法的正常运行至关重要。可以使用OpenCV的resize()方法来调整图像大小。
-
灰度化: 将彩色图像转换为灰度可以简化图像数据,并减少一些算法的计算需求。cvtColor()方法可以用来将RGB转换为灰度。
-
降噪: 可以应用平滑、模糊和过滤技术来去除图像中不希望的噪声。常用的降噪方法包括GaussianBlur()和medianBlur()方法。
-
归一化: 将像素的强度值调整到期望的范围通常在0到1之间,这可以提高机器学习模型的性能。scikit-image的Normalize()可以用来进行此操作。
-
二值化: 通过阈值处理将灰度图像转换为黑白。OpenCV中的threshold()方法用于二值化图像。
-
对比度增强: 可以使用直方图均衡化调整图像的对比度。equalizeHist()方法增强了图像的对比度。
图像加载与转换
处理图像之前,首先是加载图像,然后是把图像转换到需要用的到数据空间,以便它们可以被库处理。这里常用到OpenCV和Pillow。
加载
使用OpenCV加载图像:
import cv2
image = cv2.imread('path/to/image.jpg')
这将把图像加载为NumPy数组。OpenCV加载的图像在BGR颜色空间中,如果需要,可能需要将其转换为RGB。
使用Pillow加载图像:
from PIL import Image
image = Image.open('path/to/image.jpg')
这将加载图像并将其存储为PIL图像对象。Pillow支持的图像格式更加丰富,包括PSD、ICO和WEBP等。
在颜色空间之间转换:
如果需要在不同的颜色空间之间转换图像,可以使用OpenCV或Pillow提供的函数能直接转换。例如,将BGR转换为灰度图像:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
或者将RGB转换为HSV:
image = image.convert('HSV')
图像尺寸
调整和裁剪图像尺寸是图像预处理的非常重要第一步。由于图像具有不同的形状和大小,但许多机器学习算法通常需要标准大小的输入。因此,经常需要将图像调整和裁剪到特定的尺寸,如256x256或512X512像素。在Python中,OpenCV或Pillow库提供了图像的调整大小和裁剪方法。
使用OpenCV时,可以使用resize()
函数来调整图像的大小。例如:
import cv2
img = cv2.imread('original.jpg')
resized = cv2.resize(img, (512, 512))
这将把图像调整为512x512像素。
要裁剪图像为正方形,可以计算裁剪的中心位置,并使用OpenCV的crop()
函数。
例如:
height, width = img.shape[:2]
size = min(height, width)
x = (width - size) // 2
y = (height - size) // 2
cropped = img[y:y+size, x:x+size]
使用Pillow时,可以使用Image.open()
和resize()
函数。
例如:
from PIL import Image
img = Image.open('original.jpg')
resized = img.resize((224, 224))
要裁剪图像,可以使用img.crop()
函数。
例如:
width, height = img.size
size = min(width, height)
left = (width - size) // 2
top = (height - size) // 2
right = (width + size) // 2
bottom = (height + size) // 2
cropped = img.crop((left, top, right, bottom))
将图像调整大小和裁剪到标准尺寸是非常重要的,这样可以确保机器学习模型能够高效地处理图像,并提高结果的准确性。因此,花时间来精心调整和裁剪图像将会得到更好的模型性能。
图像归一化
在处理图像数据时,将像素值归一化以保持一致的亮度并提高对比度是很重要的。这使得图像更适合分析,并允许机器学习模型独立于光照条件学习模式。
重新缩放像素值:
最常见的归一化技术是将像素值重新缩放到0到1的范围内。这是通过将所有像素除以最大像素值(通常对于RGB图像为255)来完成的。例如:
import cv2
Img = cv2.imread('image.jpg')
normalized = Img / 255.0
这将把所有像素缩放到0和1之间,0为黑色,1为白色。
直方图均衡化:
另一个有用的技术是直方图均衡化。这通过在整个范围内展开像素强度来改善对比度。可以使用OpenCV进行应用:
eq_img = cv2.equalizeHist(img)
这对于对比度低且像素值集中在狭窄范围内的图像效果很好。
对于某些算法,将像素值归一化到零均值和单位方差是有用的。这可以通过减去均值并缩放到单位方差来完成:
mean, std = cv2.meanStdDev(img)
std_img = (img - mean) / std
这将使图像围绕零居中,标准差为1。
还有一些更复杂的归一化技术,但这三个方法——重新缩放到0-1范围、直方图均衡化和标准化——涵盖了基础知识,并将为的图像数据准备好大多数机器学习应用。确保对你的训练和测试数据应用相同的归一化,以获得最佳结果。
图像滤波
图像滤波的作用是平滑图像、去除噪声、增强图像等。滤波操作可以通过应用各种类型的滤波器来实现,其中包括线性滤波器(如均值滤波、高斯滤波)和非线性滤波器(如中值滤波)等。
高斯模糊:
高斯模糊过滤器减少图像中的细节和噪声。它通过对每个像素及其周围像素应用高斯函数来“模糊”图像。这可以帮助平滑边缘和细节,为边缘检测或其他处理技术做准备。
中值模糊:
中值模糊过滤器适用于从图像中去除盐和胡椒噪声。它的工作原理是用邻近像素的中值替换每个像素。这可以帮助平滑孤立的噪声像素,同时保留边缘。
拉普拉斯滤波器:
拉普拉斯滤波器用于检测图像中的边缘。它通过检测强度变化迅速的区域来工作。输出将是一个突出显示边缘的图像,然后可以用于边缘检测。这有助于识别和提取图像中的特征。
锐化掩蔽:
锐化掩蔽是一种用于锐化细节和增强图像边缘的技术。它的工作原理是从原始图像中减去模糊版本的图像。这放大了边缘和细节,使图像看起来更清晰。锐化掩蔽可以在特征提取或对象检测之前用于锐化细节。
双边滤波器:
双边滤波器在保留边缘的同时平滑图像。它通过考虑像素的空间接近度和颜色相似性来实现这一点。空间上靠近且颜色相似的像素将一起平滑。空间上远离或颜色差异很大的像素不会被平滑。这导致了一个具有锋利边缘的平滑图像。双边滤波器在边缘检测之前的噪声减少中可能有用。
使用分割技术检测和移除背景
检测和移除图像的背景是许多计算机视觉任务中的重要预处理步骤。分割可以将前景主题与背景分离,得到只包含主题的清晰图像。
在Python中,使用OpenCV和scikit-image进行图像分割有几种常见方法:
- 阈值化(Thresholding):阈值化是将图像转换为二值图像的方法。通过选择一个阈值,像素值高于阈值的被标记为前景,低于阈值的被标记为背景。你可以使用OpenCV的
cv2.threshold()
函数应用阈值化。
import cv2# 读取图像
img = cv2.imread('image.jpg', 0) # 以灰度模式读取图像# 应用阈值化
ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)# 显示结果
cv2.imshow('Thresholded Image', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 边缘检测(Edge Detection):边缘检测可以找到图像中的边缘,即对象之间的边界。Canny边缘检测是一种流行的算法,你可以使用OpenCV的
cv2.Canny()
函数来实现。
import cv2# 读取图像
img = cv2.imread('image.jpg', 0) # 以灰度模式读取图像# Canny边缘检测
edges = cv2.Canny(img, 100, 200)# 显示结果
cv2.imshow('Canny Edge Detection', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 区域生长(Region Growing):区域生长是一种从种子点开始,逐步将相邻像素添加到区域中的方法。你可以使用scikit-image的
skimage.segmentation.region_growing()
函数来实现。
from skimage.segmentation import region_growing
import matplotlib.pyplot as plt# 读取图像
img = plt.imread('image.jpg')# 区域生长
seed = (100, 100)
region = region_growing(img, seed)# 显示结果
plt.imshow(region, cmap='gray')
plt.axis('off')
plt.show()
- 分水岭算法(Watershed Algorithm):分水岭算法将图像视为地形图,通过模拟水流的流动来分割图像。你可以使用scikit-image的
skimage.segmentation.watershed()
函数来实现。
from skimage.segmentation import watershed
from skimage.feature import peak_local_max
from scipy import ndimage
import numpy as np
import matplotlib.pyplot as plt# 读取图像
img = plt.imread('image.jpg')# 计算距离变换
distance = ndimage.distance_transform_edt(img)# 寻找峰值
local_maxi = peak_local_max(distance, indices=False, footprint=np.ones((3, 3)), labels=img)# 应用分水岭算法
markers = ndimage.label(local_maxi)[0]
labels = watershed(-distance, markers, mask=img)# 显示结果
plt.imshow(labels, cmap='nipy_spectral')
plt.axis('off')
plt.show()
通过分割,可以从图像中隔离出主题。分割是一个关键的第一步,它允许将计算机视觉模型集中在图像最重要的部分——前景主题上。
数据集增强
数据增强是一种通过生成新的图像来人为扩展数据集大小的技术,有助于减少过拟合并提高模型的泛化能力。常见的图像数据增强包括:
-
翻转和旋转:对图像进行水平或垂直翻转,以及90度、180度、270度的旋转,可以生成新的数据点。这样做可以使模型更好地适应不同的视角和方向。
-
裁剪:将图像裁剪到不同的大小和比例,可以创建具有不同视野的新图像。随机裁剪和特定比例的裁剪都是常见的方法。
-
颜色调整:调整图像的亮度、对比度、色调和饱和度可以创建具有不同外观的图像。但要小心,不要使图像过度扭曲,以免模型混淆。
-
图像叠加:在图像上叠加透明图像、纹理或噪声可以创建原始数据的变化。例如,添加水印、标志、污垢或高斯噪声等。
-
结合技术:结合多种增强技术可以进一步扩展数据集。例如,结合翻转、旋转、裁剪和颜色调整,可以生成更多样化的图像。
通过数据增强,可以扩展数据集的大小,而无需收集更多的原始图像。这有助于减少过拟合并提高模型的性能,同时也有助于节省训练时间和成本。但要注意不要过度增强,以免导致图像失真或模型混淆。
预处理步骤
对于图像项目项目,选择正确的预处理技术取决于数据的特点和项目的目标。常见的预处理步骤:
-
调整大小:将图像调整到统一的大小对机器学习算法至关重要。通常,图像会被调整为相同的高度和宽度,例如28x28或64x64像素。你可以使用OpenCV或Pillow库中的
resize()
方法来实现。 -
颜色转换:将图像转换为灰度或黑白可以简化分析并减少噪声。使用OpenCV中的
cvtColor()
方法将图像从RGB转换为灰度。对于黑白图像,可以使用阈值化来实现。 -
降噪:使用高斯模糊、中值模糊和双边过滤等技术可以减少噪声并平滑图像。OpenCV中的
GaussianBlur()
、medianBlur()
和bilateralFilter()
方法可以实现这些过滤器。 -
归一化:将像素值归一化到标准范围,例如0到1或-1到1,有助于算法更好地工作。你可以使用scikit-image中的
normalize()
方法来实现。 -
对比度增强:对于对比度较低的图像,可以使用直方图均衡化来提高对比度。OpenCV中的
equalizeHist()
方法可以执行此任务。 -
边缘检测:在图像中找到边缘或轮廓对于许多计算机视觉任务很有用。OpenCV中的
Canny()
方法中的Canny边缘检测器是一个常用的选择。
关键是根据项目的需求选择适当的预处理技术。从基本的调整大小开始,然后尝试不同的方法来改进图像质量,最终找到最适合你项目的预处理流程。通过实验,你将找到一个理想的预处理工作流程。
图像预处理常见问题
Python支持图像格式:
Python通过OpenCV和Pillow等库支持的一些主要格式包括:
- JPEG:常见的有损图像格式
- PNG:适用于具有透明度的图像的无损图像格式
- TIFF:适用于高颜色深度图像的无损图像格式
- BMP:未压缩的光栅图像格式
如何时调整图像大小:
当以下情况时,应该调整图像大小:
- 图像太大,无法高效处理。减小大小可以加快处理速度。
- 图像需要匹配机器学习模型的输入大小。
- 图像需要在特定大小的屏幕或网页上显示。
常用的图像滤波:
一些流行的降噪技术包括:
- 高斯模糊:使用高斯滤波器模糊图像并减少高频噪声。
- 中值模糊:用邻近像素的中值替换每个像素。有效去除盐和胡椒噪声。
- 双边滤波器:在保留边缘的同时模糊图像。它可以在保留锐利边缘的同时去除噪声。
OpenCV支持哪些颜色空间:
OpenCV支持RGB、HSV、LAB和灰度颜色空间。你可以使用cvtColor
函数在颜色空间之间转换。例如:
# 将RGB转换为灰度
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)# 将RGB转换为HSV
hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)# 将RGB转换为LAB
lab = cv2.cvtColor(img, cv2.COLOR_RGB2LAB)
转换到不同的颜色空间对于某些计算机视觉任务(如阈值化、边缘检测和对象跟踪)很有用。
相关文章:

Python图像处理——计算机视觉中常用的图像预处理
概述 在计算机视觉项目中,使用样本时经常会遇到图像样本不统一的问题,比如图像质量,并非所有的图像都具有相同的质量水平。在开始训练模型或运行算法之前,通常需要对图像进行预处理,以确保获得最佳的结果。图像预处理…...

编译安装飞桨fastdeploy@FreeBSD(失败)
FastDeploy是一款全场景、易用灵活、极致高效的AI推理部署工具, 支持云边端部署。提供超过 🔥160 Text,Vision, Speech和跨模态模型📦开箱即用的部署体验,并实现🔚端到端的推理性能优化。包括 物…...
java组合总和(力扣Leetcode39)
组合总和 力扣原题链接 问题描述 给定一个无重复元素的整数数组 candidates 和一个目标整数 target,找出 candidates 中可以使数字和为目标数 target 的所有不同组合,并以列表形式返回。你可以按任意顺序返回这些组合。 示例 示例 1: 输…...

ZK友好代数哈希函数安全倡议
1. 引言 前序博客: ZKP中的哈希函数如何选择ZK-friendly 哈希函数?snark/stark-friendly hash函数Anemoi Permutation和Jive Compression模式:高效的ZK友好的哈希函数Tip5:针对Recursive STARK的哈希函数 随着Incrementally Ve…...

VMware vSAN OSA存储策略 - 基于虚拟机的分布式对象存储
简介 博客:https://songxwn.com/ 存储策略 (Storage Policy) 是管理员定义的一组规则,这组规则定义了数据对象在 vSAN 存储上是如何保存的,存储策略定义了数据存储的可靠性、访问性能等特性。vSAN 提供了基于存储策略的存储管理 SPBM (Stor…...

JUC内容概述
复习概念 Sleep和Wait的区别 Sleep是Thread的静态方法,wait是Object的方法,任何对象实例都可以使用sleep不会释放锁,他也不需要占用锁,暂停。wait会释放锁,但是调用他的前提是线程占有锁他们都可以被Interrupted方法…...
postcss安装和使用
要安装和使用 PostCSS,你可以按照以下步骤操作: 步骤一:安装 PostCSS 在项目目录下,通过 npm 初始化一个新的 package.json 文件(如果还没有): npm init -y 安装 PostCSS 和必要的插件&#x…...

macOS 13 Ventura (苹果最新系统) v13.6.6正式版
macOS 13 Ventura是苹果电脑的全新操作系统,它为用户带来了众多引人注目的新功能和改进。该系统加强了FaceTime和视频通话的体验,同时优化了邮件、Safari浏览器和日历等内置应用程序,使其更加流畅、快速和安全。特别值得一提的是,…...

WordPress Git主题 响应式CMS主题模板
分享的是新版本,旧版本少了很多功能,尤其在新版支持自动更新后,该主题可以用来搭建个人博客,素材下载网站,图片站等 主题特点 兼容 IE9、谷歌 Chrome 、火狐 Firefox 等主流浏览器 扁平化的设计加响应式布局&#x…...

安卓国内ip代理app,畅游网络
随着移动互联网的普及和快速发展,安卓手机已经成为我们日常生活和工作中不可或缺的一部分。然而,由于地理位置、网络限制或其他因素,我们有时需要改变或隐藏自己的IP地址。这时,安卓国内IP代理App便成为了一个重要的工具。虎观代理…...

Day53:WEB攻防-XSS跨站SVGPDFFlashMXSSUXSS配合上传文件添加脚本
目录 MXSS UXSS:Universal Cross-Site Scripting HTML&SVG&PDF&SWF-XSS&上传&反编译(有几率碰到) SVG-XSS PDF-XSS Python生成XSS Flash-XSS 知识点: 1、XSS跨站-MXSS&UXSS 2、XSS跨站-SVG制作&配合上传 3、XSS跨站-…...

k8s安装traefik作为ingress
一、先来介绍下Ingress Ingress 这个东西是 1.2 后才出现的,通过 Ingress 用户可以实现使用 nginx 等开源的反向代理负载均衡器实现对外暴露服务,以下详细说一下 Ingress,毕竟 traefik 用的就是 Ingress 使用 Ingress 时一般会有三个组件: …...

如何在Windows 10中打开屏幕键盘?这里有详细步骤
本文解释了在Windows 10中打开或关闭屏幕键盘的不同方法,还解释了如何将屏幕键盘固定到开始菜单。 使用屏幕键盘的快捷键 如果你喜欢快捷方式,你会喜欢这个:按物理键盘上的WinCTRLO。这将立即显示屏幕键盘,而无需通过轻松使用。…...

【Pt】马灯贴图绘制过程 03-制作油渍、积尘效果
目录 效果 一、制作油渍效果 1.1 基本油渍 1.2 流淌的油渍痕迹 二、制作浮尘效果 三、制作积尘效果 效果 一、制作油渍效果 1.1 基本油渍 将上篇制作的“锈迹_深色”和“锈迹_浅色”两个文件夹再次合并为一个文件夹 这里就命名为“锈迹” 添加一个填充图层 设置Base …...
python-numpy-常用函数详解
文章目录 一、函数详解np.empty(num_points)np.zeros(shape, dtypefloat, orderC)np.tile(A, reps)np.newaxisnumpy.stack(arrays, axis0)np.roll(a, shift, axisNone) 二、实例矩阵进行扩展三行,使得每一行都与第一行相同二维数组每行减去不同的数 一、函数详解 n…...

UE小:基于UE5的两种Billboard material(始终朝向相机材质)
本文档展示了两种不同的效果,分别是物体完全朝向相机和物体仅Z轴朝向相机。通过下面的演示和相关代码,您可以更加直观地理解这两种效果的差异和应用场景。 1. 完全朝向相机效果 此效果下,物体将完全面向相机,不论相机在哪个角度…...
spring boot actuator 安全配置 springboot的安全性
关于springboot Actuator框架的安全配置方案: 加入security安全验证框架 方案一: 配置信息: spring:security:user:password: adminname: adminmanagement:endpoints:web:base-path: /monitorexposure:include: "*"# 排除端点e…...

macOS Sonoma如何查看隐藏文件
在使用Git进行项目版本控制时,我们可能会遇到一些隐藏文件,比如.gitkeep文件。它通常出现在Git项目的子目录中,主要作用是确保空目录也可以被跟踪。 终端命令 在尝试查看.gitkeep文件时,使用Terminal命令来显示隐藏文件 default…...
深入浅出:语言模型的原理、实战与评估
深入浅出:语言模型的原理、实战与评估 1. 引言1.1. 关于语言模型1.2. 语言模型的重要性 2. 语言模型简介2.1. 语言模型的类型2.2. 技术演进 3. 语言模型的原理3.1. 概率基础3.2. 深度学习模型 4. 语言模型的实战应用4.1. 数据准备4.2. 模型训练4.3. 应用场景 5. 语言…...

基于ssm的线上旅行信息管理系统论文
摘 要 随着旅游业的迅速发展,传统的旅行信息查询管理方式,已经无法满足用户需求,因此,结合计算机技术的优势和普及,特开发了本线上旅行信息管理系统。 本论文首先对线上旅行信息管理系统进行需求分析,从系…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...