边缘检测

一、图像边缘检测

基本思路:

基于边缘检测的图像分割方法的基本思路是先确定图像中的边缘像素,然后再把这些像素连接在一起就构成所需的区域边界。
在这里插入图片描述

在这里插入图片描述

图像边缘:

图像边缘,即表示图像中一个区域的终结和另一个区域的开始,图像中相邻区域之间的像素集合构成了图像的边缘。所以,图像边缘可以理解为图像灰度发生空间突变的像素的集合。图像边缘有两个要素,即:方向和幅度。沿着边缘走向的像素值变化比较平缓;而沿着垂直于边缘的走向,像素值则变化得比较大。因此,根据这一变化特点,通常会采用一阶和二阶导数来描述和检测边缘。

综上,图像中的边缘检测可以通过对灰度值求导数来确定,而导数可以通过微分算子计算来实现。在数字图像处理中,通常是利用差分计算来近似代替微分运算。

二、微分算子

常用的一阶微分算子有Roberts、Prewitt、Sobel等算子,常用的二阶微分算子有Laplace和Kirsh等算子。在实际处理操作中常用模板矩阵与图像像素值矩阵卷积来实现微分运算。

由于垂直边缘的方向上的像素点和噪声都是灰度不连续点,所以变换到频域时,在频域均为高频分量,直接采用微分运算不可避免地会受到噪声的很大影响。 因此,微分算子只适用于图像噪声比较少的简单图像。针对此问题,LoG算子(Laplace of Gaussian)和Canny算子采取的方法是,先对图像进行平滑滤波,然后再用微分算子与图像进行卷积操作,这样处理会得到比较好的边缘检测结果。其中,LoG算子是采用Laplacian算子计算高斯函数的二阶导数,Canny算子是高斯函数的一阶导数,两种算子在抑制噪声和检测边缘之间取得了比较好的平衡。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5. canny算子

在这里插入图片描述

算法实现

转载于:https://github.com/pammy818/edge-detection

canny
import cv2
import numpy as np  
 
img = cv2.imread("lanb.jpg", 0)
 
img = cv2.GaussianBlur(img,(3,3),0)
canny = cv2.Canny(img, 50, 150)
 
cv2.imshow('Canny', canny)
cv2.imwrite('Canny.jpg', canny)
cv2.waitKey(0)
cv2.destroyAllWindows()
roberts
import cv2
import numpy as np

#step1:compressed image size
image=cv2.imread('lanb.jpg',0)
rows,cols=image.shape 
g_f = np.copy(image)
g_f = g_f.astype("float")


Roberts = np.zeros((rows, cols))

for i in range(rows-1):
    for j in range(cols-1):
        gx = abs(g_f[i + 1, j+ 1] - g_f[i, j])
        gy = abs(g_f[i+ 1, j] - g_f[i, j + 1])
        if gx>=12 and gy >= 12:
           Roberts[i,j] = gx + gy
 
cv2.imshow('roberts',Roberts)
cv2.imwrite('roberts.jpg',Roberts)
cv2.waitKey(0)
sobel
import cv2
import numpy as np

#step1:compressed image size
image=cv2.imread('lanb.jpg',0)
rows,cols=image.shape 
g_f = np.copy(image)
g_f = g_f.astype("float")


sobel = np.zeros((rows, cols))

for x in range(rows-1):
    for y in range(cols-1):
        gx = abs((g_f[x + 1, y - 1] + g_f[x + 1, y]+ g_f[x + 1, y] + g_f[x + 1, y + 1]) - (
            g_f[x - 1, y - 1] + g_f[x - 1, y] + g_f[x - 1, y]+ g_f[x - 1, y + 1]))
        gy = abs((g_f[x - 1, y - 1] + g_f[x, y - 1] + g_f[x, y - 1]+ g_f[x + 1, y - 1]) - (
            g_f[x - 1, y +1] + g_f[x, y + 1] + g_f[x, y + 1]+ g_f[x + 1, y + 1]))
        if gx>=30 and gy >= 30:
         sobel[x,y] = gx + gy
 
cv2.imshow('sobel',sobel)
cv2.imwrite('sobel.jpg',sobel)
cv2.waitKey(0)
  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值