Python图像处理——计算机视觉中常用的图像预处理

news/2024/5/7 19:28:30/文章来源:https://blog.csdn.net/matt45m/article/details/137092314

概述

在计算机视觉项目中,使用样本时经常会遇到图像样本不统一的问题,比如图像质量,并非所有的图像都具有相同的质量水平。在开始训练模型或运行算法之前,通常需要对图像进行预处理,以确保获得最佳的结果。图像预处理包括调整大小和裁剪到降噪和归一化的各种技术。涉及的库有OpenCV、Pillow和scikit-image等。

图像预处理

图像预处理是将原始图像数据操作成可用和有意义格式的过程。它允许消除不希望的失真并增强计算机视觉应用所需的特定品质。预处理是准备图像数据输入到机器学习模型之前的重要步骤。

常用的图像预处理:

  1. 调整大小: 将图像调整到统一的大小对机器学习算法的正常运行至关重要。可以使用OpenCV的resize()方法来调整图像大小。

  2. 灰度化: 将彩色图像转换为灰度可以简化图像数据,并减少一些算法的计算需求。cvtColor()方法可以用来将RGB转换为灰度。

  3. 降噪: 可以应用平滑、模糊和过滤技术来去除图像中不希望的噪声。常用的降噪方法包括GaussianBlur()和medianBlur()方法。

  4. 归一化: 将像素的强度值调整到期望的范围通常在0到1之间,这可以提高机器学习模型的性能。scikit-image的Normalize()可以用来进行此操作。

  5. 二值化: 通过阈值处理将灰度图像转换为黑白。OpenCV中的threshold()方法用于二值化图像。

  6. 对比度增强: 可以使用直方图均衡化调整图像的对比度。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进行图像分割有几种常见方法:

  1. 阈值化(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()
  1. 边缘检测(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()
  1. 区域生长(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()
  1. 分水岭算法(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()

通过分割,可以从图像中隔离出主题。分割是一个关键的第一步,它允许将计算机视觉模型集中在图像最重要的部分——前景主题上。

数据集增强

数据增强是一种通过生成新的图像来人为扩展数据集大小的技术,有助于减少过拟合并提高模型的泛化能力。常见的图像数据增强包括:

  1. 翻转和旋转:对图像进行水平或垂直翻转,以及90度、180度、270度的旋转,可以生成新的数据点。这样做可以使模型更好地适应不同的视角和方向。

  2. 裁剪:将图像裁剪到不同的大小和比例,可以创建具有不同视野的新图像。随机裁剪和特定比例的裁剪都是常见的方法。

  3. 颜色调整:调整图像的亮度、对比度、色调和饱和度可以创建具有不同外观的图像。但要小心,不要使图像过度扭曲,以免模型混淆。

  4. 图像叠加:在图像上叠加透明图像、纹理或噪声可以创建原始数据的变化。例如,添加水印、标志、污垢或高斯噪声等。

  5. 结合技术:结合多种增强技术可以进一步扩展数据集。例如,结合翻转、旋转、裁剪和颜色调整,可以生成更多样化的图像。

通过数据增强,可以扩展数据集的大小,而无需收集更多的原始图像。这有助于减少过拟合并提高模型的性能,同时也有助于节省训练时间和成本。但要注意不要过度增强,以免导致图像失真或模型混淆。

预处理步骤

对于图像项目项目,选择正确的预处理技术取决于数据的特点和项目的目标。常见的预处理步骤:

  1. 调整大小:将图像调整到统一的大小对机器学习算法至关重要。通常,图像会被调整为相同的高度和宽度,例如28x28或64x64像素。你可以使用OpenCV或Pillow库中的resize()方法来实现。

  2. 颜色转换:将图像转换为灰度或黑白可以简化分析并减少噪声。使用OpenCV中的cvtColor()方法将图像从RGB转换为灰度。对于黑白图像,可以使用阈值化来实现。

  3. 降噪:使用高斯模糊、中值模糊和双边过滤等技术可以减少噪声并平滑图像。OpenCV中的GaussianBlur()medianBlur()bilateralFilter()方法可以实现这些过滤器。

  4. 归一化:将像素值归一化到标准范围,例如0到1或-1到1,有助于算法更好地工作。你可以使用scikit-image中的normalize()方法来实现。

  5. 对比度增强:对于对比度较低的图像,可以使用直方图均衡化来提高对比度。OpenCV中的equalizeHist()方法可以执行此任务。

  6. 边缘检测:在图像中找到边缘或轮廓对于许多计算机视觉任务很有用。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)

转换到不同的颜色空间对于某些计算机视觉任务(如阈值化、边缘检测和对象跟踪)很有用。

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

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

相关文章

巨控GRM560工业物联网的升级后的功能

巨控GRM560:工业自动化领域的革命者 标签:#工业自动化 #PLC #远程控制 #OPCUA #MQTT 随着工业4.0时代的到来,智能制造已经成为了发展的大势所趋。在这样的背景下,自动化控制系统的核心——可编程逻辑控制器(PLC)的作用…

pytorch如何向tensor结尾添加元素或维度--torch.cat()、torch.unsqueeze()的用法

目录 示例1 矢量后增加元素 示例2 tensor维度增加1 示例3 另一种替代unsqueeze的方法 示例1 矢量后增加元素 使用torch.cat()函数 ptorch.Tensor([1,5,0]) ptorch.cat((p, torch.Tensor([4])), 0) 结果: 这里,cat的第一个输入变量用()包绕&#xf…

Vue.js高效前端开发(增删查)

效果图 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><div id"app"><span>ID</span><input type"text" name"…

javaSwing五子棋游戏

一、导言 五子棋&#xff0c;是一种源自中国古代的棋类游戏&#xff0c;也是一种非常古老和经典的对弈游戏。它简单易懂&#xff0c;规则清晰&#xff0c;深受广大玩家喜爱。本文将介绍如何利用Java Swing这个强大的GUI工具包&#xff0c;来实现一个简单的五子棋游戏。通过这个…

mysql基础2多表查询

多表查询 多表关系: 一对多 案例: 部门 与 员工的关系 关系: 一个部门对应多个员工&#xff0c;一个员工对应一个部门 实现: 在多的一方建立外键&#xff0c;指向一的一方的主键 多对多 案例: 学生 与 课程的关系 关系: 一个学生可以选修多门课程&#xff0c;一门课程也可以…

《论文阅读》PAGE:一个用于会话情绪原因蕴含基于位置感知的图模型 ICASSP 2023

《论文阅读》PAGE&#xff1a;一个用于会话情绪原因蕴含基于位置感知的图模型 ICASSP 2023 前言 简介任务定义模型构架Utterances Encoding with EmotionPosition-aware GraphCausal Classifier实验结果 前言 亲身阅读感受分享&#xff0c;细节画图解释&#xff0c;再也不用担…

鸿蒙开发之ArkUI组件常用组件图片和文本

ArkUI即方舟开发框架是HarmonyOS应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff08;组件、布局、动画以及交互事件&#xff09;&#xff0c;以及实时界面预览工具等&#xff0c;可以支持开发者进行可视化界面开发。 开发文档地址 &…

国产数据库中统计信息自动更新机制

数据库中统计信息描述的数据库中表和索引的大小数以及数据分布状况&#xff0c;统计信息的准确性对优化器选择执行计划时具有重要的参考意义。本文简要整理了下传统数据库和国产数据库中统计信息的自动更新机制&#xff0c;以加深了解。 1、数据库统计信息介绍 优化器是数据库…

20240319-图论

图论练习题目 拓扑排序深度优先搜索方法广度优先搜索方法 无向无权图无向有权图有向无权图 利用广度优先搜索算法有向有权图 带排序的广度优先算法/dijkstra最小生成树prims算法Kruskals Algorithm 最小割 min-cut二分图 Bipartite Graph 队列例题1 所有可能的路径例题2 岛屿数…

思腾合力受邀出席文化和旅游虚拟现实应用推广交流活动并作主题演讲

3月21日&#xff0c;由文化和旅游部产业发展司主办&#xff0c;中国信息通信研究院、北京市石景山区文化和旅游局、中国动漫集团有限公司承办的“数字赋能文旅场景建设行动——文化和旅游虚拟现实应用推广交流活动”在北京首钢一高炉SoReal科幻乐园成功举办。 思腾合力CMO徐莉受…

unity学习(71)——编译游戏发生错误3——回调问题——必须使用mapHandker的update

move这种一直发送的&#xff0c;第一次写&#xff0c;之前的数据包收发都是一次性的来完成单次任务&#xff01; 1.服务器最后一次出问题时的调试状态如下&#xff1a; 2.定位代码如下 可见确实LogicHandler了&#xff0c;也确实直行到119行的位置了 3.修改catch&#xff0c…

GPT提示词分享 —— 写作标题生成器

我想让你充当书面作品的标题生成器。我将向你提供一篇文章的主题和关键词&#xff0c;你将生成五个吸引人的标题。请保持标题简洁&#xff0c;不超过 20 个字&#xff0c;并确保保持其含义。答复时要利用题目的语言类型。我的第一个题目是 [文章内容] 3.5的回答&#x1f447;fr…

C++第十三弹---内存管理(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、operator new与operator delete函数 1.1、operator new与operator delete函数 2、new和delete的实现原理 2.1、内置类型 2.2、自定义类型 …

HTTP系列之HTTP缓存 —— 强缓存和协商缓存

文章目录 HTTP缓存强缓存协商缓存状态码区别缓存优先级如何设置强缓存和协商缓存使用场景 HTTP缓存 HTTP缓存时利用HTTP响应头将所请求的资源在浏览器进行缓存&#xff0c;缓存方式分两种&#xff1a;强缓存和协商缓存。 浏览器缓存是指将之前请求过的资源在浏览器进行缓存&am…

Qt creator构建DLL库

文章目录 一、构建DLL库二、隐式调用DLL库 一、构建DLL库 Qt creator创建DLL项目。 实现功能函数。 运行代码&#xff0c;debug目录下会有.dll和.lib文件。 二、隐式调用DLL库 QT新建控制台项目。将.lib文件和与之关联的头文件赋值到项目文件夹。 3. 添加头文件和外部依赖库…

数据可视化-ECharts Html项目实战(6)

在之前的文章中&#xff0c;我们学习了如何设置散点图、雷达图。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢数据可视化-ECharts Html项目实战&#xff08;5&a…

【数据分析面试】2.连续访问最长天数用户(SQL)

题目 给定一个包含事件日志的表格&#xff0c;找出连续访问平台时间最长的前五个用户。 注意&#xff1a;连续访问是指用户在连续的几天内每天至少访问一次平台。 示例&#xff1a; 输入&#xff1a; events 表 ColumnTypeuser_idINTEGERcreated_atDATETIMEurlVARCHAR 输…

学习人工智能:Attention Is All You Need-2-Transformer模型;Attention机制;位置编码

3.2 注意力机制Attention 注意力函数可以描述为将查询和一组键值对映射到输出的过程&#xff0c;其中查询、键、值和输出都是向量。输出被计算为值的加权和&#xff0c;其中每个值的权重由查询与相应键的兼容性函数计算得出。 3.2.1 缩放点积注意力 Scaled Dot-Product Attenti…

Python——jieba优秀的中文分词库(基础知识+实例)

Hello&#xff0c;World&#xff01; 从去年开始学习Python&#xff0c;在长久的学习过程中&#xff0c;发现了许多有趣的知识&#xff0c;不断充实自己。今天我所写的内容也是极具趣味性&#xff0c;关于优秀的中文分词库——jieba库。 &#x1f3d4;关于Jieba &#x1f412;…

BUG定位---一起学习吧之测试

判断一个BUG是前端还是后端的&#xff0c;通常需要根据BUG的具体表现、发生的环境以及相关的技术栈来进行分析。以下是一些常用的判断方法&#xff1a; 错误发生的位置&#xff1a; 如果BUG涉及的是页面的布局、样式、交互效果等&#xff0c;那么很可能是前端的BUG。如果BUG与…