sqlserver2008 不产生log_数字图像处理DIP_3_LoG算法

b31f5854395dbae72a04eae0c85caaa1.png

DIP第三章作业

鉴于LoG算法在历史中的地位,进行较深入的实验研究。探讨不同σ对LoG算法的影响。图像Chapter3_1.pgm

计算公式(*表卷积)见(1)

2fbef438a8057356bc1c8ba70974779c.png

1)取σ =1.2然后求零交叉的结果

2)取σ =2.8的然后求零交叉的结果

3)讨论和结论:零交叉对σ的依赖性


软件平台

Python3.6 + OpenCV4.4.0

LoG原理

LoG边缘检测算子是David Courtnay Marr和Ellen Hildreth(1980)共同提出的。因此,也称为边缘检测算法或Marr & Hildreth算子。该算法首先对图像做高斯滤波,然后再求其拉普拉斯(Laplacian)二阶导数。即图像与 Laplacian of the Gaussian function 进行滤波运算。最后,通过检测滤波结果的零交叉(Zero crossings)可以获得图像或物体的边缘。因而,也被业界简称为Laplacian-of-Gaussian (LoG)算子。

算法描述:LoG算子也就是 Laplace of Gaussian function(高斯拉普拉斯函数)。常用于数字图像的边缘提取和二值化。LoG 算子源于D.Marr计算视觉理论中提出的边缘提取思想,即首先对原始图像进行最佳平滑处理,最大程度地抑制噪声,再对平滑后的图像求取边缘。

由于噪声点(灰度与周围点相差很大的像素点)对边缘检测有一定的影响,所以效果更好的边缘检测器是LoG算子,也就是Laplacian-Gauss算子。它把的Gauss平滑滤波器和Laplacian锐化滤波器结合了起来,先平滑掉噪声,再进行边缘检测,所以效果会更好。

实验步骤

首先,构造LoG卷积算子(根据σ和N的大小);然后将灰度图与LoG算子计算卷积;最后根据零交叉点将图像二值化,确定图像边缘。

讨论和结论

当σ取不同的值时,则可以用 LoG 算子检测不同尺度下图像的强度变化,小的滤波器 (σ较小)用于检测细节,大的滤波器(σ较大)用于检测轮廓 (模糊的边缘)。通常,我们取 σ≥1, 并且以 σ=1 为最小的滤波器,此时 W≈3,可用于检测非常精确的细节,但同时对噪声的抑制作用减弱,对于反差较小的区域也比较敏感。事实上,边缘往往是在相邻像素之间产生, 也就是说,最精确的细节应该在W ≤2 时产生。此时,σ<1,对原始影像的低通滤波作用极小,几乎相当于直接对原始影像作拉普拉斯变换 (高通滤波),只有在灰度变化比较明显(聚焦良好)的情况下,才能检测到零交叉,从而可以部份地避免检测反差较小的区域。此外,由于实际处理的对象为数字图像,当 σ=0.5 时,LoG 算子在 r =1 处达到负的极值,因此,σ的取值应大于0.5,否则,实际的卷积核已不能表示出 LoG 算子。

同时LoG模板N的大小和标准差的关系,遵循高斯分布的3σ原则,也就是当位置超过均值正负3σ 以外的值很小,也就是说,LOG模板应该选择大于6σ 的最小奇数作为模板大小,过大效果不会有提高反而增加计算量,过小会造成截断,无法得到正确结果。

14f2bfc7ec83d18653259417a0679199.png
不同σ的零交叉

当σ接近1时,LoG 算子对影像细节进行检测的同时,对噪声比较敏感(如图)。当σ不断增大时,LoG算子可以对大的模糊的边缘(轮廓)进行检测 (如图)。

因此,当空间常数σ接近1时,可以获得与边缘比较一致的零交叉,检测到影像中的聚焦良好的物体的精细边缘特征;但容易受反差较大的噪声影响,当空间常数σ增大时(σ=2.8),可以检测到影像中的模糊边缘(轮廓)。零交叉算子计算简单,便于实现,而且不涉及阈值问题,在一定程度上,可满足应用要求。

代码思路大概如下:

#LOG卷积算子
def getKernel(sigma,N):
    #构建高斯矩阵,得到中心点位置
    gaussMatrix = np.zeros([N,N],np.float32)
    cH = (N-1)/2
    cW = (N-1)/2
    for r in range(N):
        for c in range(N):
            norm2 = np.power(r-cH,2) + np.power(c-cW,2)
            gaussMatrix[r][c] = (norm2 / np.power(sigma,4) - 2 / np.power(sigma,2)) * np.exp(- norm2 / (2*np.power(sigma,2)))
    return gaussMatrix
def LoG(image, sigma, size, _boundary="symm"):
    # 卷积计算
    loGkernel = getKernel(sigma, size)
    img_log = signal.convolve2d(image, loGkernel, 'same', boundary=_boundary)
    return img_log
img = cv.imread('Chapter3_1.pgm',-1)
images = [img]
sigma = [1.2, 2.8]
size = [9, 21]
for i in range(2):
    img_con_log = LoG(img, sigma[i], size[i], 'symm')
    w = len(img_con_log)
    h = len(img_con_log[0])
    # 找零交叉并二值化
    logzero = np.zeros((w, h))
    for x in range(0, w - 1):
        for y in range(0, h - 1):
            if ((img_con_log[x][y] * img_con_log[x + 1][y]) < 0 or (img_con_log[x][y] * img_con_log[x][y + 1]) < 0):
                logzero[x][y] = 1

    logzero = np.asarray(logzero)
    images.append(logzero)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值