赞
踩
图像提取边缘是基于像素梯度方法实现的,原理是把图像的灰度看成二维曲面,边缘是曲面的突出部分,利用梯度找到变化最的突变点。要想得到一幅图像的梯度,则要在图像的每个像素点位置进行计算偏导数,公式如下:
对应的差分公式:
当已知离散数据点Z(xi,yi),i=1,2,3,...n时,对应的差分为公式:
通过计算上述两个差分的模,即可得到点(xi,yi)处的幅值,从而得到当图像像素矩阵为im,则点(i, j)处的特征计算公式可以简化为:
(1)一阶导数的边缘算子
通过模板作为核与图像的每个像素点做卷积和运算,然后选取合适的阈值来提取图像的边缘。常见的有Roberts算子、Sobel算子和Prewitt算子。
(2)二阶导数的边缘算子
依据于二阶导数过零点,常见的有Laplacian 算子,此类算子对噪声敏感。
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()
结果如图所示:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。