第十三章 图像特征Vol.1:全局特征与区域特征 - 知乎 (zhihu.com)
图像特征度量分类
图像,计算机视觉特征度量是计算机视觉领域中的一个重要问题,它涉及到如何定义并计算用于描述图像或视频的特征的相似性或差异性。所谓的视觉特征,通常是由计算机从图像或视频中提取出来的数值表示。例如:颜色直方图、梯度直方图、形状描述符。这些特征可以用来描述图像或视频的不同方面,如颜色、纹理、形状等。
视觉特征度量的目标是计算两个特征之间的相似性或距离。相似性度量通常用于比较两个特征的相似度;距离度量通常用于比较两个特征之间的差异程度。常见的视觉特征度量方法包括欧式距离、余弦相似度、汉明距离、马氏距离等。
纹理区域度量
纹理是图像中重要的视觉特征之一,它通常指由像素之间的亮度、颜色、形状等局部特征构成的、重复出现的图案或结构。在计算机视觉中,纹理区域度量是指对图像中的纹理区域进行特征提取和相似性度量的过程。常见的纹理区域度量方法包括以下7种:
1.1 边缘特征
1.1.1 sobel算子
sobel算子是一种基于梯度的图像边缘检测算子,它通过计算图像中每个像素的梯度值,得到图像中的边缘信息。Sobel算子通过卷积操作来实现,其计算公式如下:
bilibili教学理解sobel算子:和
分别为水平方向上和垂直方向上的sobel算子模板。
将原始图像和sobel算子模板(滤波器)进行卷积运算,卷积计算过程:对于原始图像的每个像素点,将sobel算子模板与其周围像素值进行卷积运算,即可得到该像素点在水平或垂直方向上的梯度值。然后组合水平和垂直方向上的梯度,得到原始图像中每个像素点的梯度值(大小和方向)。
sobel算子的python实现:
import torch
import torch.nn as nn
from PIL import Image
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
class Sobel(nn.Module):
'''
基于梯度的图像边缘检测算子
'''
def __init__(self):
# 定义sober算子的模板==卷积核==滤波器
self.sobel_x = torch.tensor([[-1,0,1],[-2,0,2],[-1,0,1]],dtype=torch.float32).view(1,1,3,3) #(1,1,3,3)
self.sobel_y = torch.tensor([[-1,-2,-1],[0,0,0],[1,2,1]],dtype=torch.float32).view(1,1,3,3)
def forward(self,x):
# 自定义卷积运算(卷积核通道数==输入特征图通道数;卷积核个数==输出特征图个数)
G_x = nn.Conv2d(in_channels=1,out_channels=1,kernel_size=3,stride=1,padding=1,bias=False)
G_x.weight.data = self.sobel_x
G_y = nn.Conv2d(in_channels=1,out_channels=1,kernel_size=3,stride=1,padding=1,bias=False)
G_y.weight.data = self.sobel_y
# 计算每个像素点的梯度
grad = torch.sqrt(G_x(x).pow(2)+G_y(x).pow(2))
return grad
if __name__ == '__main__':
sobel = Sobel()
print(sobel.sobel_x.shape) #(1,1,3,3)
# 输入图像
img_dir = r'./Lenna.jpg'
image = Image.open(img_dir).convert('L')
# 第一次图像变换操作(image--tensor)
transform1 = transforms.ToTensor()
img_to_tensor = transform1(image)
print(img_to_tensor.shape) #(1,316,316)
sobel_tensor = sobel.forward(img_to_tensor)
# 第二次图像变换操作(tensor--image)
transform2 = transforms.ToPILImage()
image = transform2(sobel_tensor)
# 显示图像
plt.imshow(image)
plt.axis('off')
plt.show()
1.1.2 canny算子
sobel算子是一种基于多阶段的图像边缘检测算子。它通过滤波、非极大值抑制、双阈值分割等步骤来检测图像中的边缘。
canny边缘检测的步骤:
- 应用高斯滤波器,以平滑图像,滤除噪声。
- 计算图像中每个像素点的梯度大小和方向。
- 使用非极大值抑制,消除边缘检测带来的不利影响
- 应用双阈值分割确定真实和潜在的边缘
- 通过抑制孤立的弱边缘完成边缘检测
canny算子的步骤示意图:
1. 首先对图像进行高斯滤波
2. 计算滤波后图像中每个像素点的梯度大小和方向 3. 对梯度幅值进行非极大值抑制
4. 应用双阈值分割确定真实和潜在的边缘【双阈值检测】