Python彩色图像卷积特征提取——边缘提取

一、边缘提取

   图像提取边缘是基于像素梯度方法实现的,原理是把图像的灰度看成二维曲面,边缘是曲面的突出部分,利用梯度找到变化最的突变点。要想得到一幅图像的梯度,则要在图像的每个像素点位置进行计算偏导数,公式如下:

     

 对应的差分公式:

 当已知离散数据点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()

结果如图所示:

Python彩色图像卷积特征提取——边缘提取_第1张图片Python彩色图像卷积特征提取——边缘提取_第2张图片

 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()

 结果如图所示:

Python彩色图像卷积特征提取——边缘提取_第3张图片Python彩色图像卷积特征提取——边缘提取_第4张图片

你可能感兴趣的:(图像处理,计算机视觉,人工智能,图像处理)