
相信大家在做项目的时候或多或少都为图像质量烦恼过。
在训练模型或运行算法之前,通常需要对图像进行预处理,以获得最佳效果,而Python图像预处理无疑是最佳选择。
本文你将带大家使用Python准备图像进行分析的所有技巧和方法,从调整大小、裁剪,到降噪和归一化。
什么是图像预处理,为什么它如此重要?
图像预处理是将原始图像数据转换为可用且有意义格式的过程,它能帮助你消除不必要的畸变,并增强对计算机视觉应用至关重要的特定特征。
预处理是准备图像数据以供机器学习模型使用的关键第一步。
图像预处理常用的技术包括:
调整大小:将图像调整为统一尺寸,对于确保机器学习算法正常运行至关重要。我们可以使用OpenCV的resize()方法调整图像大小。
灰度化:将彩色图像转换为灰度图像,可以简化图像数据,并降低某些算法的计算需求。可以使用cvtColor()方法将RGB转换为灰度图像。
降噪:通过平滑、模糊和滤波技术,可以去除图像中的不需要的噪声。常用的方法有GaussianBlur()和medianBlur()。
归一化:归一化将像素的强度值调整到期望范围内,通常是0到1之间。这可以提高机器学习模型的性能。可以使用scikit-image中的normalize()方法进行归一化。
二值化:二值化通过阈值处理将灰度图像转换为黑白图像。可以使用OpenCV中的threshold()方法进行二值化。
对比度增强:可以使用直方图均衡化来调整图像的对比度。equalizeHist()方法可以增强图像的对比度。
通过合理组合这些技术,你可以显著提升图像数据质量,构建更出色的计算机视觉应用,图像预处理能够将原始图像优化为适合解决特定问题的格式。
使用Python库加载和转换图像
要在Python中开始图像处理,你需要将图像加载并转换为库可以处理的格式。最常用的两个选项是OpenCV和Pillow。
使用OpenCV加载图像:OpenCV可以加载PNG、JPG、TIFF和BMP等格式的图像。你可以使用以下代码加载图像:
import cv2
image = cv2.imread(path/to/image.jpg')
图像将以NumPy数组的形式加载,且处于BGR色彩空间,你可能需要将其转换为RGB。
使用Pillow加载图像:Pillow是PIL(Python Image Library)的一个友好分支,支持比OpenCV更多的格式,包括PSD、ICO和WEBP,你可以使用以下代码加载图像:
from PIL import Image
image = Image.open('path/to/image.jpg')
图像将处于RGB色彩空间。
色彩空间转换:你可能需要在RGB、BGR、HSV和灰度等色彩空间之间转换图像。
这可以使用OpenCV或Pillow完成,例如要在OpenCV中将BGR转换为灰度,可以使用:
gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
或在Pillow中将RGB转换为HSV:
image = image.convert('HSV')
掌握了这些基础技能,你将能够进一步学习更高级的技术,如调整大小、滤波、边缘检测等。
将图像调整和裁剪为标准尺寸
图像预处理的一个重要第一步是调整和裁剪图像,图像尺寸各异,但机器学习算法通常需要标准尺寸。
你可能需要将图像调整和裁剪为正方形尺寸,如224x224或256x256像素。
在Python中,你可以使用OpenCV或Pillow库进行图像的调整大小和裁剪。
例如,使用OpenCV的resize()函数:
import cv2
img = cv2.imread ('original.jpg')
resized = OV2.resize(img, (224, 224))
要将图像裁剪为正方形,你可以计算中心正方形的裁剪尺寸,并使用OpenCV的crop()函数(通过中心坐标实现,或手动计算裁剪区域):
height, width = img.shape[2]
size = min (height, width)
x = (width - size) /| 2
y = (height - size) /| 2
cropped = ingly: y+size, xix+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) / 2bottom = (height + size) / 2cropped = 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的equalizeHist()函数应用:
eq_img = cv2.equalizeHist(img)
对于低对比度图像,当像素值集中在狭窄范围内时,此方法效果良好。
标准化(零均值和单位方差):对于某些算法,将像素值标准化为具有零均值和单位方差是有用的,这可以通过减去均值并缩放到单位方差来实现:
mean, std = cv2.meanStdDev (img)
std_img = (img - mean) / std
这将使图像以零为中心,标准差为1。
还有一些更复杂的归一化技术,但上述三种方法——重缩放到0-1范围、直方图均衡化和标准化——涵盖了基础知识,并将为大多数机器学习应用准备好图像数据。
请务必对训练数据和测试数据应用相同的归一化方法,以获得最佳效果。
应用滤波器以减少噪声和锐化图像
一旦你在Python中加载了图像,就可以开始增强它们了,图像滤波器用于减少噪声、锐化细节,并在分析前整体提高图像质量。
以下是你需要了解的一些主要滤波器:
高斯模糊:高斯模糊滤波器可以减少图像中的细节和噪声。它通过对每个像素及其周围像素应用高斯函数来“模糊”图像。这有助于在边缘检测或其他处理技术之前平滑边缘和细节。
中值模糊:中值模糊滤波器对于去除图像中的椒盐噪声非常有用。它通过将每个像素替换为其相邻像素的中值来工作。这有助于平滑孤立的噪声像素,同时保留边缘。
拉普拉斯滤波器:拉普拉斯滤波器用于检测图像中的边缘。它通过检测强度快速变化的区域来工作。输出将是一个边缘被高亮的图像,然后可用于边缘检测。这有助于识别和提取图像中的特征。
非锐化掩膜:非锐化掩膜是一种用于锐化细节和增强图像边缘的技术。它通过从原始图像中减去模糊版本的图像来工作。这放大了边缘和细节,使图像看起来更锐利。非锐化掩膜可用于在特征提取或目标检测之前锐化细节。
双边滤波器:双边滤波器在平滑图像的同时保留边缘。它通过考虑像素的空间接近度和颜色相似性来实现这一点。空间上接近且颜色相似的像素被一起平滑。距离较远或颜色差异很大的像素则不被平滑。这导致了一个平滑但边缘锐利的图像。双边滤波器可用于在边缘检测之前降噪。
通过应用这些滤波器,你将获得高质量、增强的图像。
使用分割技术检测和去除背景
对于许多计算机视觉任务来说,检测和去除图像中的背景是一个重要的预处理步骤。
分割将前景主体与背景分离,留下一个仅包含主体的干净图像。
在Python中,可以使用OpenCV和scikit-image通过以下几种常见方式执行图像分割:
阈值处理:阈值处理通过选择阈值将灰度图像转换为二值图像(黑白)。比阈值暗的像素变为黑色,比阈值亮的像素变为白色。这对于高对比度和均匀光照的图像效果良好。你可以使用OpenCV的threshold()方法应用阈值处理。
边缘检测:边缘检测可以找到图像中物体的边缘。通过连接边缘,你可以隔离前景主体。Canny边缘检测器是一种流行的算法,可以在scikit-image的canny()方法中实现。调整low_threshold和high_threshold参数以检测边缘。
区域生长:区域生长从一组种子点开始,并向外生长以检测图像中的连续区域。你提供种子点,算法检查相邻像素以确定是否应将其添加到区域中。这将继续进行,直到无法再添加更多像素为止。skimage.segmentation.region_growing()方法实现了这一技术。
分水岭算法:分水岭算法将图像视为地形图,其中高强度像素代表山峰,低谷代表区域之间的边界。它从山峰开始并向下淹没,当不同区域相遇时创建屏障。skimage.segmentation.watershed()方法执行分水岭分割。
通过尝试这些技术,你可以从图像中隔离出主体,分割是一个关键的第一步,使你能够将计算机视觉模型集中在图像中最重要的部分——前景主体上。
使用数据增强来扩展你的数据集
数据增强是一种通过从现有图像生成新图像来人为扩展数据集大小的技术。
这有助于减少过拟合,并提高模型的泛化能力,图像数据的一些常见增强技术包括:
翻转和旋转:简单地翻转(水平或垂直)或旋转(90、180、270度)图像可以生成新的数据点。例如,如果你有1000张猫的图像,翻转和旋转它们可以给你总共4000张图像(1000张原始图像 + 1000张水平翻转图像 + 1000张垂直翻转图像 + 1000张旋转90度的图像)。
裁剪:将图像裁剪为不同的大小和比例可以从同一张原始图像创建新图像。这使你的模型能够接触到相同内容的不同构图和取景。你可以创建不同大小的随机裁剪,或针对更具体的裁剪比例(如正方形)。
颜色操作:调整亮度、对比度、色调和饱和度是创建新增强图像的简单方法。例如,你可以随机调整图像的亮度和对比度高达30%以生成新的数据点。但要注意不要过度扭曲图像,否则可能会使模型感到困惑。
图像叠加:将透明图像、纹理或噪声叠加到现有图像上是另一种简单的增强技术。添加水印、标志、污渍/划痕或高斯噪声等可以创建原始数据的现实变体。从微妙的叠加开始,看看你的模型如何响应。
组合技术:为了最大程度地增加数据量,你可以在同一张图像上组合多种增强技术。例如,你可以翻转、旋转、裁剪并调整图像的颜色,从一张原始图像生成许多新的数据点。但要注意不要过度增强,否则可能会使图像扭曲到无法辨认的地步!
使用数据增强,你可以轻松地将图像数据集的大小增加4倍、10倍或更多,而无需收集任何新图像。
这样做有助于对抗过拟合并提高模型准确性,同时保持训练时间和成本不变。
为你的应用选择正确的预处理步骤
为你的图像分析项目选择正确的预处理技术取决于你的数据和目标,一些常见步骤包括:
调整大小:将图像调整为一致的大小对于机器学习算法的正常工作非常重要。你可能希望所有图像都具有相同的高度和宽度,通常是一个较小的尺寸(如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支持哪些图像格式?
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)
转换为不同的色彩空间对于某些计算机视觉任务(如阈值处理、边缘检测和目标跟踪)非常有用。
另外我们精心打磨了一套基于数据与模型方法的 AI科研入门学习方案(已经迭代过5次),对于人工智能来说,任何专业,要处理的都只是实验数据,所以我们根据实验数据将课程分为了三种方向的针对性课程,包含时序、图结构、影像三大实验室,我们会根据你的数据类型来帮助你选择合适的实验室,根据规划好的路线学习 只需5个月左右(很多同学通过学习已经发表了 sci 一区及以下、和同等级别的会议论文)学习形式为直播+录播,多位老师为你的论文保驾护航。
还有图结构、时序两个实验室(根据你的数据类型来选择)
大家感兴趣可以直接添加小助手微信:ai0808q 通过后回复咨询既可!
AI for science
大家想自学的我还给大家准备了一些机器学习、深度学习、神经网络资料大家可以看看以下文章(文章中提到的资料都打包好了,都可以直接添加小助手获取)
大家觉得这篇文章有帮助的话记得分享给你的死党、闺蜜、同学、朋友、老师、敌蜜!