《计算机视觉之PyTorch数字图像处理》--图像处理基础知识
[复制链接]
本帖最后由 dirty 于 2024-12-7 17:53 编辑
本篇讲述学习图像处理基础知识。
张量概念
张量(Tensor)是PyTorch的核心概念,是PyTorch中最重要的数据类型。PyTorch里的一切操作都是直接或间接对张量进行的运算和处理。PyTorch里张量与数学上的多维数组在一定程度上是同义词,与Numpy里的数组类型相近,同一个张量中的元素都具有相同的类型,但也具有Numpy所不具备的自动梯度功能和在有CUDA功能的GPU加速张量运算等优点。
张量在表示图像时,通常只用到张量的一个子集:在张量形状上是二维张量或三维的张量;在数据类型上,是float32或uint8类型。进行张量的运算就是对数字图像的处理,反之,要完成特定的数字图像处理任务就需要设计相应的张量运算。
图像处理基础知识
图像与张量的互操作,是表述图像和张量之间的密切关系,能够将图像转为张量,并将处理后的张量转为图像。
以下是使用图像存取库PIL读入图像,再将图像转为符合以上定义的张量。在图像处理完成后,将符合上述定义的张量,再通过图像存取模块PIL转回到图像的图像与张量互操作代码
from PIL import Image
import numpy as np
import torch as tc
def loadimage(imgpath):
try:
img=Image.open(imgpath) #打开图像
t=tc.from_numpy(np.array(img)) #将图像先转为numpy数组,再转为张量
dm=t.dim() #判断图像的类型
if dm==2: #维度是2的话是单通道灰度图
imgt=t.unsqueeze(0) #对灰度图添加1个通道维度
elif dm>=3:
t=t.permute([2,0,1]) #对于彩色多通道图,调整轴的顺序从 HxWxC到CxHxW
imgt=t[:3,:,:] #抛弃透明通道,只保留颜色通道
else:
print('wrong dimention')
raise(Exception)
#t is CxHxW 3dim tensor
return imgt.float() #最后将1字节整型转为32位浮点型返回
except Exception:
print('图像打开失败:{}\n'.format(imgpath))
####################################################################
def saveimage(imgtensor,imgpath,suffix='png'):
#接收形如CxHxW的张量imgtensor,保存到指定路径
d=imgtensor.byte().squeeze(0) #将张量从32位浮点型转回uint8型,并尝试去除通道维
if d.dim()==3: #对压缩后仍有三维的张量说明是彩色图像
d=d.permute([1,2,0]) #调整轴的顺序为HxWxC
d=Image.fromarray(d.numpy()) #从张量到图像
d.save(imgpath) #保存图像到指定路径,路径中包含带有图像格式的后缀
if __name__=='__main__':
s=loadimage('../1.png') #打开图像
print(s.shape)
saveimage(s,'../2.jpg') #保存图像
Pytorch图像处理基础知识点主要包括:图像与张量的互操作,图像的点运算,图像的邻域运算,图像的全局运算。下面一一展开讲述。
●图像的点运算:主要用于图像的增强,色彩空间的变换,图像的混合和图像的蒙板。
图像处理中最简单的运算是图像的点运算。图像的点运算就是根据一定的规则将输入图像上每一个位置上的像素值计算得到另一个新的像素值,而像素的位置不发生改变。
图像增强用于调节图像的灰度分布,能够增大和突出图像中感兴趣区域的视觉效果,是最常用的图像处理方法。通常图像增强是一种保序的点运算,即变化前后不同像素间像素值的大小顺序保持不变。
常用图像增强方法有伽马变换、对数变换、图像反转、以及灰度值缩放等。
伽马变换,也叫伽马矫正,是一种非线性变换,用于调节过曝或者曝光不足(过暗)的灰度图的对比度。设置不同的参数,伽马变换或者让图像中较暗区域的灰度值得到增强,或者让图像中灰度值过大的区域的灰度值得到降低,从而达到增强图像整体细节的效果。下面是伽马变换的公式与代码
import visdom
# 连接到 Visdom 服务器(默认端口是 8097)
vis = visdom.Visdom(server='localhost', port=8097, env='my_env')
#伽马变换
def gamma(x,gm=0.3,c=1):
return c*x**gm
#测试函数
def draw44(gm=2):
#gamma变换
img=loadimage('./1.png')
img=img/255 #注意在伽马变换前需要对图像归一化
rimg=gamma(img,gm)
vis.image(rimg)
draw44(1) #图4.4(a)
draw44(2) #图4.4(b)
draw44(0.3) #图4.4(c)
注意这里需要启动visdom (控制台输入python -m visdom.server或visdom,在网页http://localhost:8097/查看),导入visdom,定义vis。
其他如对值变换、图像翻转、图像色彩变换(包含灰度变换、HSI色彩变换、HSV色彩变换、CIE XYZ色彩变换、CIE Lab色彩变换)、灰度图像的亮度变换等。
图像二值化(Image Binarization)一般是指将整个图像像素的灰度值压缩为两个级别,一般为0(黑色)或255(白色)。
图像蒙板(Mask)用于突显图像中的感兴趣区域,将非感兴趣的区域填充相同的灰度值。
图像的混合是两个或两个以上图像进行融合或者将一个图像粘贴到另一个图像上。通过图像的混合和粘贴可以生成新的图像,给视觉带来新的感受。
●图像的邻域运算:主要用于图像的去噪,形态学运算,图像局部特征的构造。
在实际中图像中某个像素与其邻近的像素关系更为密切,相互之间的影响也更大。这样也就是说对于大多数情况来说,在单个像素进行处理时仅使用其像素值是不充足的,但使用图像中的所有像素又是不必要且浪费的,使用与其相邻的部分像素则是最为合理的。基于这样的思想,产生了一系列基于图像邻域操作的图像处理方法。
目前,图像的邻域运算是最重要的图像处理方法,已经用于图像处理的各个方面,包括图像的平滑、去噪、边缘增强、形态学处理、图像的灰度共生矩阵、局部最大值指数,以及深度学习等。
PyTorch框架里对于张量提供了便捷的邻域操作方法,从而将张量直接以指定邻域大小进行展开为低维的张量,随后可以使用其它方法完成对领域的操作,最后使用展开的逆方法进行张量的折叠,恢复为处理后图像。PyTorch中使用unfold()函数展开图像,进行均值运算,再使用fold()函数折叠回图像。为了使滤波前后图像的尺寸保持不变,需要在邻域处理前先进行padding预处理。
图像中包含的噪声会影响图像的视觉感受,并且会严重地干扰后续图像处理的结果,因此,图像噪声的去除是图像处理的重要方法。通常使用图像滤波的方法进行噪声的去除,可以较好去除图像上的随机噪声。常用的滤波去噪方法有:均值滤波、中值滤波以及高斯滤波。
形态学运算(Morphological Operations)是一系列基于邻域的图像处理方法,将结构元素应用于输入图像并生成输出图像。形态学运算已广泛应用于二值图像和灰度图像的处理和分析。图像的形态学运算通常用于进行噪声抑制、纹理分析、形状分析、边缘检测、骨架化和多尺度过滤,其应用也很广泛。
局部二值化描述子(Local Binary Patterns,LBP)是一种描述图像局部纹理的特征,常用于图像的分类。
●图像的全局运算:主要用于图像的旋转,裁切,缩放,直方图变换。
图像的全局运算可以看作把整幅图像作为邻域,即图像的邻域扩大到整幅图像,计算的结果会对整幅图像的像素值改变,或者改变图像的大小。图像的全局运算通常包含图像的旋转、翻转、缩放、裁切、直方图均衡化等。
图像的简单旋转与翻转也是对图像处理的基本方法。图像可以在平面以任意角度进行旋转,张量运算的三个函数:tc.rot90(),tc.flip(),tc.roll()可以完成图像的旋转、图像的翻转、图像的滚动操作。
图像的缩放也是基本的图像处理方法,作用是调整图像尺寸。在图像的缩放里,最关键的技术是像素的重采样方法,常用的重采样方法有最近邻法(Nearest Neighbor),线性插值(Linear Interpolation),双线性二次插值(Bilinear Interpolation)等。在PyTorch里,位于torch.nn模块下的functional包里的interpolate()函数进行实现。
图像的裁切是图像处理的基本操作,通过裁切或用于提取整块图像里感兴趣的区域,或用于调整图像间的尺寸到指定大小。
直方图均衡化是一种简单有效的图像增强技术。通过调整图像的直方图来改变图像中各像素的灰度,主要用于增强动态范围偏小的图像的对比度。
可以看出,图像处理的基础知识点还是蛮多的,也有挺强的专业性,透过梳理学习理解,有了更深入认识。
|