一、图像边缘检测
基本思路:
基于边缘检测的图像分割方法的基本思路是先确定图像中的边缘像素,然后再把这些像素连接在一起就构成所需的区域边界。
图像边缘:
图像边缘,即表示图像中一个区域的终结和另一个区域的开始,图像中相邻区域之间的像素集合构成了图像的边缘。所以,图像边缘可以理解为图像灰度发生空间突变的像素的集合。图像边缘有两个要素,即:方向和幅度。沿着边缘走向的像素值变化比较平缓;而沿着垂直于边缘的走向,像素值则变化得比较大。因此,根据这一变化特点,通常会采用一阶和二阶导数来描述和检测边缘。
综上,图像中的边缘检测可以通过对灰度值求导数来确定,而导数可以通过微分算子计算来实现。在数字图像处理中,通常是利用差分计算来近似代替微分运算。
二、微分算子
常用的一阶微分算子有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)