一、边缘提取
图像提取边缘是基于像素梯度方法实现的,原理是把图像的灰度看成二维曲面,边缘是曲面的突出部分,利用梯度找到变化最的突变点。要想得到一幅图像的梯度,则要在图像的每个像素点位置进行计算偏导数,公式如下:
对应的差分公式:
当已知离散数据点Z(xi,yi),i=1,2,3,...n时,对应的差分为公式:
通过计算上述两个差分的模,即可得到点(xi,yi)处的幅值,从而得到当图像像素矩阵为im,则点(i, j)处的特征计算公式可以简化为:
二、常见的算子
(1)一阶导数的边缘算子
通过模板作为核与图像的每个像素点做卷积和运算,然后选取合适的阈值来提取图像的边缘。常见的有Roberts算子、Sobel算子和Prewitt算子。
(2)二阶导数的边缘算子
依据于二阶导数过零点,常见的有Laplacian 算子,此类算子对噪声敏感。
三、python代码实现
1.单通道图像特征提取
#img1为单通道图像像素矩阵
#返回图像的特征
def SingChannelGradientFun(img):
[m,n]=img1.shape
eim=np.zeros([m,n])
for i in range(m-1):
for j in range(n-1):
eim[i,j]=abs(img[i,j+1]-img[i,j])+abs(img[i+1,j]-img[i,j])
return eim
2.灰度图像或彩色图像的特征提取
def GradientEdgeFun(img):
h=img.shape[0]
w=img.shape[1]
imShape=img.shape
dim=len(imShape)
if dim==2:#灰度图像的特征提取
eim=SingChannelGradientFun(img)
else: #彩色图像的特征提取
imR=img[:,:,0]
imG=img[:,:,1]
imB=img[:,:,2]
eim=np.zeros((h,w,3))#利用矩阵进行填充
eimr=SingChannelGradientFun(imR)
eimg=SingChannelGradientFun(imG)
eimb=SingChannelGradientFun(imB)
eim[:,:,0]=eimr
eim[:,:,1]=eimg
eim[:,:,2]=eimb
return eim
3.text
1.灰度图
import matplotlib.pyplot as plt
import cv2
import numpy as np
img1=cv2.imread('lena.bmp',0)
eim1=GradientEdgeFun(img1).astype(np.uint8)
cv2.imshow('img1',img1)
cv2.imshow('eim1',eim1)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果如图所示:
2.彩色图
import matplotlib.pyplot as plt
import cv2
import numpy as np
img2=cv2.imread('peppers.JPG')
new_img2=cv2.cvtColor(img2,cv2.COLOR_BGR2RGB)#opencv读入的图像是BGR的我们进行转换
eim2=GradientEdgeFun(new_img2).astype(np.uint8)
new_eim2=cv2.cvtColor(eim2,cv2.COLOR_RGB2BGR)
plt.imshow(new_img2)
plt.show()
plt.imshow(eim2)
plt.show()
结果如图所示: