利用Sobel算子构造图邻接矩阵

这篇博客介绍了Sobel算子在边缘检测中的应用,它通过计算图像像素点的梯度来检测边缘。提供的代码展示了如何在PyTorch中构建Sobel卷积核,并应用于图像特征,通过水平和垂直方向的卷积以及点乘操作,最后进行softmax归一化来获取边缘信息。
摘要由CSDN通过智能技术生成

索贝尔算子(Sobeloperator)主要用于获得数字图像的一阶梯度,是一种离散性差分算子。

 套用公式如下:

Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。 

Sobel算子作为一种边缘检测算子,那么如何利用Sobel算子构造邻接矩阵呢?

代码如下:

class Sobel(nn.Module):   
    def __init__(self,in_channel,out_channel):
        super(Sobel,self).__init__()
        kernel_x = [[-1.0,0.0,1.0],[-2.0,0.0,2.0],[-1.0,0.0,1.0]]         #横向Sobel卷积因子
        kernel_y = [[-1.0,-2.0,-1.0],[0.0,0.0,0.0],[1.0,2.0,1.0]]         #纵向Sobel卷积因子
        kernel_x = torch.FloatTensor(kernel_x).expand(out_channel,in_channel,3,3)  #将Sobel卷积核个数扩展到out_channel个,卷积核通道扩展到in_channel
        kernel_x = kernel_x.type(torch.cuda.FloatTensor)                  #应该是将张量转到cuda上
        kernel_y = torch.cuda.FloatTensor(kernel_y).expand(out_channel,in_channel,3,3)
        kernel_y = kernel_y.type(torch.cuda.FloatTensor)
        self.weight_x = nn.Parameter(data=kernel_x, requires_grad=False).clone()
        self.weight_y = nn.Parameter(data=kernel_y, requires_grad=False).clone()
        self.softmax = nn.Softmax()
    
    def forward(self,x):
        b,c,h,w = x.size()
        sobel_x = F.conv2d(x,self.weight_x,stride=1, padding=1)
        sobel_x = torch.abs(sobel_x)
        sobel_y = F.conv2d(x,self.weight_y,stride=1, padding=1)
        sobel_y = torch.abs(sobel_y)
        if c == 1:
            sobel_x = sobel_x.view(b, h, -1)
            sobel_y = sobel_y.view(b, h, -1).permute(0,2,1)
        else: 
            sobel_x = sobel_x.view(b, c, -1)
            sobel_y = sobel_y.view(b, c, -1).permute(0,2,1)
        sobel_A = torch.bmm(sobel_x,sobel_y)      #水平竖直方向的特征进行点乘
        sobel_A = self.softmax(sobel_A)
        return sobel_A

利用Sobel卷积因子构造卷积核,使的卷积核对特卷积核的个数和通道数与输入特征匹配,使用水平和竖直方向卷积核对特征图卷积,得到的水平和竖直方向的特征进行点乘,点乘之后的特征进行softmax归一化。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sobel算子是一种常用的边缘检测算子,可以利用它来分割像。 以下是利用Sobel算子像进行分割的步骤: 1. 首先,将像转换为灰度像。 2. 然后,利用Sobel算子计算像的梯度值。Sobel算子可以计算水平和垂直方向上的梯度值,一般使用两个3x3的卷积核来进行计算。 3. 接着,将梯度值进行加权合并,得到像的边缘强度。一般使用下面的公式来进行计算: edge_strength = sqrt((Gx)^2 + (Gy)^2) 其中,Gx和Gy分别为水平和垂直方向上的梯度值。 4. 最后,根据设定的阈值对边缘强度进行二值化处理,得到分割后的像。 下面是Python代码实现: ```python import cv2 import numpy as np # 读取像 img = cv2.imread("image.jpg") # 转换为灰度像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 计算Sobel算子 sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3) sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3) # 计算边缘强度 edge_strength = np.sqrt(sobelx ** 2 + sobely ** 2) # 二值化处理 threshold_value = 100 edge_img = np.zeros_like(edge_strength) edge_img[edge_strength > threshold_value] = 255 # 显示结果 cv2.imshow("Original Image", img) cv2.imshow("Edge Image", edge_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的代码中,我们使用了cv2.Sobel函数来计算Sobel算子,使用了np.sqrt函数计算边缘强度的值,使用了numpy数组的操作来进行二值化处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值