PIL,OpenCV,Blob分析,STN网络,滤波器,插值,RandAugment,SIFT算法
图像处理,图像增强,图像分类
'''resample:可选参数,指图像重采样滤波器,有四种过滤方式,分别是
Image.BICUBIC(双立方插值法)
PIL.Image.NEAREST(最近邻插值法)
PIL.Image.BILINEAR(双线性插值法)
PIL.Image.LANCZOS(下采样过滤插值法),默认为 Image.BICUBIC'''
# box四元组指的是像素坐标 (左,上,右,下)
#(0,0,120,180),表示以原图的左上角为原点,选择宽和高分别是(120,180)的图像区域
image=im.resize((550,260),resample=Image.LANCZOS,box=(0,0,120,180))
1.2.1 滤波器
ImageFilter模块提供了滤波器相关定义;这些滤波器主要用于Image类的filter()方法。
img = img.filter(ImageFilter.BLUR)
1.2.2 kernel函数
ImageEnhance 模块包含许多可用于图像增强的类
能给图像化圆弧,画横线,写上文字等。
# 导入 OpenCV 库
import cv2 as cv
# 读取图片
src = cv.imread("./1.jpg")
# 创建窗口
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
# 将图片显示在窗口上
cv.imshow("input image",src)
# 等待用户操作
cv.waitKey(0)
# 关掉窗口
cv.destroyAllWindows()
cv2.MORPH_ERODE | 腐蚀 |
cv2.MORPH_DILATE | 膨胀 |
cv2.MORPH_ OPEN | 开运算,先腐蚀后膨胀,抹除了图像的外部细节 |
cv2.MORPH_CLOSE | 闭运算,先膨胀后腐蚀,抹除图像的内部细节 |
cv2.MORPH_GRADIENT | 梯度运算,膨胀图减腐蚀图,得到一个大概的、不精准的轮廓 |
cv2.MORPH_TOPHAT | 顶帽运算,原始图减开运算图,结果也就只剩外部细节 |
cv2.MORPH_BLACKHAT | 黑帽运算,原始图减闭运算图,结果只剩下内部细节 |
Blob(Binary large object)是指图像中的具有相似颜色、纹理等特征所组成的一块连通区域,一般来说,该区域就是图像中的前景。Blob分析目的在于对图像中的2-D形状进行检测和分析,得到诸如目标位置、形状、方向和目标间的拓扑关系(即包含关系)等信息。根据这些信息可对目标进行识别。在某些应用中我们不仅需要利用2D的形状特征,还要利用Blob分析之间的特征关系。
Blob分析的主要内容包括:(1)图像分割:将图像中的目标和背景分离。(2)去噪:消除或减弱噪声对目标的干扰:(3)场景描述:对目标之间的拓扑关系进行描述。(4)特征量计算:计算目标的2-D形状特征。
Blob的实现流程大致可分为3个步骤:获取图像、提取Blob、Blob分析。
STN提出的空间网络变换层STL,具有平移不变性、旋转不变性及缩放不变性等强大的性能。这个网络可以加在现有的卷积网络中,提高分类的准确性。
将 spatial transformers 模块集成到 cnn 网络中,允许网络自动地学习如何进行 feature
map 的转变,从而有助于降低网络训练中整体的代价。定位网络中输出的值,指明了如何对
每个训练数据进行转化。
1.1.1 参数的选择(仿射矩阵就可以实现旋转平移放缩):
1.1.2 Sampler对目标权值计算(考虑小数对图片的对应, 以便反向传播计算),整个公式:
其中,kernel k表示一种线性插值方法,比如双线性插值:
举个例子:
详细解读Spatial Transformer Networks(STN)-一篇文章让你完全理解STN了_黄小猿的博客-CSDN博客_stn算法
图像增强是有目的地强调图像的整体或局部特性,例如改善图像的颜色、亮度和对比度等,将原来不清晰的图像变得清晰或强调某些感兴趣的特征,扩大图像中不同物体特征之间的差别,抑制不感兴趣的特征,提高图像的视觉效果。传统的图像增强已经被研究了很长时间,现有的方法可大致分为三类,空域方法是直接对像素值进行处理,如直方图均衡,伽马变换;频域方法是在某种变换域内操作,如小波变换;混合域方法是结合空域和频域的一些方法。传统的方法一般比较简单且速度比较快,但是没有考虑到图像中的上下文信息等,所以取得效果不是很好。
加权最小二乘滤波器是一种保边滤波器,其目标是是滤波结果尽可能接近原图,同时在梯度较小区域尽可能平滑,而强梯度的边缘部分尽可能保持。(图像u 与原始图像 p经过平滑后尽量相似,但是在边缘部分尽量保持原状)
已知(x0, y0) 与 (x1, y1),求(x,y)
双线性插值本质上就是在两个方向上做线性插值。比如说已知四个Q点的值,求P点:
先在x方向线性插值,得到两个R值:
然后再y方向线性插值得到P值:
albumentations包是一种针对数据增强专门写的API,里面基本包含大量的数据增强手段,比起pytorch自带的transform更丰富,搭配使用效果更好。
Index - Albumentations Documentationhttps://albumentations.ai/docs/api_reference/
import albumentations as A
# 定义增强
transform = A.Compose([
A.RandomCrop(width=256, height=256, p=1),
A.HorizontalFlip(p=0.5),
])
#图像增强
transformed = transform(image=image, mask=mask)
图文说明:Albumentations数据增强方法-CSDN博客_albumentations数据增强
from torch.utils.data import Dataset
from albumentations.pytorch import ToTensorV2 #转换为张量
class CustomDataset(Dataset):
def __init__(self, images, masks):
self.images = images # 假设这是一个numpy图像列表
self.masks = masks # 假设这是一个numpy掩码列表
self.transform = A.Compose([
A.RandomCrop(width=256, height=256, p=1),
A.HorizontalFlip(p=0.5),
ToTensorV2,
])
def __len__(self):
return len(self.images)
def __getitem__(self, idx):
"""返回单个样本"""
image = self.images[idx]
mask = self.masks[idx]
transformed = self.transform(image=image, mask=mask)
transformed_image = transformed["image"]
transformed_mask = transformed["mask"]
return transformed_image, transformed_mask
首个采用搜索技术进行自动数据增广的方法
from torchvision.transforms import autoaugment, transforms
train_transform = transforms.Compose([
transforms.RandomResizedCrop(crop_size, interpolation=interpolation),
transforms.RandomHorizontalFlip(hflip_prob),
# 这里policy属于torchvision.transforms.autoaugment.AutoAugmentPolicy,
# 对于ImageNet就是 AutoAugmentPolicy.IMAGENET
# 此时aa_policy = autoaugment.AutoAugmentPolicy('imagenet')
autoaugment.AutoAugment(policy=aa_policy, interpolation=interpolation),
transforms.PILToTensor(),
transforms.ConvertImageDtype(torch.float),
transforms.Normalize(mean=mean, std=std)
])
随机自动增广,展示了根据模型和数据集大小的数据增强最优强度,说明在小代理任务中的增强策略是正常增强策略的子最优。
具体地,RandAugment共包含两个超参数:图像增强操作的数量N和一个全局的增强幅度M。每次从候选操作集合(共14种策略)随机选择N个操作(等概率),然后串行执行(这里没有判断概率,是一定执行)。这里的M取值范围为{0, . . . , 30}(每个图像增强操作归一化到同样的幅度范围),而N取值范围一般为 {1, 2, 3}。
from torchvision.transforms import autoaugment, transforms
train_transform = transforms.Compose([
transforms.RandomResizedCrop(crop_size, interpolation=interpolation),
transforms.RandomHorizontalFlip(hflip_prob),
autoaugment.RandAugment(interpolation=interpolation),
transforms.PILToTensor(),
transforms.ConvertImageDtype(torch.float),
transforms.Normalize(mean=mean, std=std)
])
虽然RandAugment的搜索空间极小,但是对于不同的数据集还是需要确定最优的N和M,这依然有较大的实验成本。TrivialAugment每次随机选择一个图像增强操作,然后随机确定它的增强幅度,并对图像进行增强。由于没有任何超参数,所以不需要任何搜索。
from torchvision.transforms import autoaugment, transforms
train_transform = transforms.Compose([
transforms.RandomResizedCrop(crop_size, interpolation=interpolation),
transforms.RandomHorizontalFlip(hflip_prob),
autoaugment.TrivialAugmentWide(interpolation=interpolation),
transforms.PILToTensor(),
transforms.ConvertImageDtype(torch.float),
transforms.Normalize(mean=mean, std=std)
])
BOW模型主要包含以下四个步骤:
对于未知类别的图片,计算它的bag of words,使用训练的分类器进行分类。
import segmentation_models_pytorch as smp
model = smp.Unet(
encoder_name="resnet34", # choose encoder, e.g. mobilenet_v2 or efficientnet-b7
encoder_weights="imagenet", # use `imagenet` pre-trained weights for encoder initialization
in_channels=1, # model input channels (1 for gray-scale images, 3 for RGB, etc.)
classes=3, # model output channels (number of classes in your dataset)
OpenCV+Python特征提取算法与图像描述符之SIFT / SURF / ORB