人工智能图像识别四大算子(一)

本文涉及的产品
视觉智能开放平台,视频资源包5000点
视觉智能开放平台,分割抠图1万点
视觉智能开放平台,图像资源包5000点
简介: 人工智能图像识别四大算子(一)

背景引入


图像识别是当今计算机科学最热门的研究方向之一。随着科学技术的发展和人类社会的不断进步,图像识别技术在很多行业得到了广泛的应用。本章除了对图像识别基本概念进行介绍外,还将从图像识别基本算法与实际应用等几个方面引导读者利用Python以及所需第三方工具进行相关的编程实践。


图像识别发展简介


图像识别(Image Recognition)是人工智能的一个重要研究领域。它以图像的主要特征区域(检测目标)为基础,通过数据获取一系列的相关处理,并采用各种算法来对目标图像进行检测,识别与理解。其中,图象是承载检测目标的载体,而检测目标则需事先进行特征提取,归纳。最终通过相应的算法分离出来。通常情况下,一个图像识别系统主要由图像分割图像特征提取,分类与识别3个部分组成。其中,图像分割主要用于将图像划分成多个区域,而图像特征提取则是从图像中寻找最具区分能力的特征,分类与识别则是按照图像特征所提取的结果进行适当的分类。

图像识别的发展经历了三个阶段:文字识别(Character Recognition),数字图像处理(Digital Image Processing)与识别,物体识别(Object Recognition)。


①.文字识别的研究从20世纪50年代开始,主要是识别字母,数字和符号,包括印刷文字以及手写文字等,应用非常广泛。

②.数字图像处理与识别的研究始于20世纪70年代,数字图像与模拟图像相比具有易于存储,便于传输,可压缩,传输过程中不易失真,处理方便等巨大优势,这些都为图像识别技术的发展提供了有力支持。

③. 物体识别技术起源于20世纪50年代,他是计算机视觉领域中的一个重要分支,其主要任务是识别出图像中有什么物体,并指出该物体在图像场景中的位置和方向等相关信息。随着人工智能,大数据和深度学习技术的不断发展,以及3D传感器,深度摄像头等硬件的不断升级,利用深度信息进行三维物体识别技术的广泛应用,让物体识别领域有了较大发展。目前,物体识别方法主要有基于模型的识别和基于上下文(Context)的识别。


图像识别的数学本质是模式空间到类别空间的映射。目前在图像识别技术的发展过程中,主要有三种识别方法:统计模式识别,结构模式识别以及模糊模式识别


边缘检测算法


边缘检测是图像处理和计算机视觉,尤其是图像特征提取中的一个重要研究领域。图像的边缘是图像的重要特征,是计算机视觉,模式识别的基础,是图像处理中一个重要的环节。通常情况下,人们可以仅凭一个剪影或草图来识别出物体的类型或姿态,而剪影就由边缘特征构成。边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常包括:深度上的不连续,表面方向不连续,物质属性变化和场景照明变化等图像边缘检测会大幅度减少数据量,并剔除不相关的信息,只保留图像重要的结构属性。

人类视觉系统认识目标的过程分为两步:首先,将图像边缘与背景分离出来;然后,感知图像的细节,辨认出图像的轮廓。计算机视觉正是模仿人类视觉的这个过程,在检测物体边缘时,先对其轮廓点进行粗略检测,然后通过连接规则把原来检测到的轮廓点连接起来,同时也检测和连接遗漏的边界点以及除去虚假的边界点。

如果我们需要检测一幅图像的边缘,我们首先需要明确知晓边缘的特征。对于一幅灰度图像而言,边缘两边的灰度值肯定不同,因此,当我们检测灰度图像的边缘时,就需要找出图像何处的灰度值变化最大。显然,灰度值变化越大,对比度越大,边缘也就越明显。

在数学中,与变化率息息相关的是导数。如果灰度图像的像素是连续的,那么我们可以对图像G的x方向和y方向分别求导数:

Gx=f'(G,x)Gy=f'(G,y)

获得x方向的图像导数Gx和y方向的图像导数Gy。Gx和Gy分别隐含了x方向和y方向的灰度变化信息,也就是隐含了图像的边缘信息。

如果要在同一图像上包含两个方向的边缘信息,我们可以用梯度。原图像G的梯度向量Gxy为(Gx,Gy),梯度向量的大小|Gxy|和方向∠Gxy可用以下两个公式进行计算:

|Gxy|=^(Gx²+Gy²) ∠Gxy=arctan(Gy/Gx)

梯度向量的大小就包含了x方向和y方向的边缘信息。

实际上,图像矩阵是离散的。连续函数求变化率用的是导数,而离散函数求变化率用的是差分。差分的概念也很容易理解,就是用相邻两个数的差来表示变化率。下面公式是向后差分

x方向的差分:Gx(n,y)=G(n,y)-G(n-1,y) y方向的差分:Gy(x,n)=Gy(x,n)-Gy(x,n-1)

实际计算图像导数时,我们是通过原图像和一个 **算子(Operator)进行卷积计算来完成的(该方法是求图像的近似导数)。所谓“算子”就是数学中的映射。如果映射的作用是把函数映射到函数或者把函数映射到数,那么这种映射就被称为算子。广而言之,对任何函数进行某一项操作皆可以认为是一个算子,甚至包括求幂,开方等皆可认为是一个算子,只是有的算子我们用符号来代替他们的主要运算。对于图像边缘检测的常见算子有 Prewitt算子,Sobel算子,Laplace算子,Canny算子等


Prewitt算子


Prewitt算子是最简单的图像求导算子,也是一种常用的边缘检测一阶微分算子。它利用像素点左右上下,左右相邻点的灰度差在边缘处达到极值来进行边缘检测。Prewitt算子在图像空间利用两个方向模板与图像进行领域卷积(Adjacent Convolution)运算来完成边缘检测。在图像处理中,卷积是常用的一种运算,通常是使用一个卷积核(算子)对图像中的每个像素进行一系列操作从而得到新的像素值。Prewitt算子有两个方向模板,一个用于水平方向(x)方向的边缘检测,一般设置为01fc212df5357e2f21bf8ce70ee750e9_6e9937d8d0b7400da5e2d4198ac384ab.png

;另一个则用于垂直方向上(y)的边缘检测,一般设置为:cac72854ce5619ab90e25bdf7ee05b72_abdf1d559cb9464aa3b0d1af2fc26ffd.png

前面我们已经介绍过卷积算法,这里就直接使用,不再过度介绍。

示例代码:


import numpy as np #用于处理图像矩阵,算子矩阵即相关运算
from PIL import Image #图像处理模块
import matplotlib.pyplot as plt
import matplotlib.cm as cm
#定义图像卷积函数
'''
Scipy库中的signal模块含有一个二维卷积函数convolved2d() 后面就会直接使用
'''
def img_conv(image_array,operator):
    image=image_array.copy()#原图像矩阵的深拷贝
    dim1,dim2=image.shape
    #将矩阵中的每个元素与算子矩阵中的对应元素相乘再求和(忽略最外圈的边框像素)
    for i in range(1,dim1-1):
        for j in range(1,dim2-1):
            image[i,j]=(image_array[(i-1):(i+2),(j-1):(j+2)]*operator).sum()
        #由于卷积后各元素的值不一定为0~255,需归一化0~255
    image=image*(255.0/image.max())
    #返回结果矩阵
    return image
#定义x方向的Prewitt算子
operator_x=np.array([[-1,0,-1],[-1,0,-1],[-1,0,-1]])
#定义y方向上的prewitt算子
operator_y=np.array([[-1,-1,-1],[0,0,0],[1,1,1]])
#打开原图并将其转化为灰度图像
image=Image.open('D:\Python\.vscode\__pycache__\.vscode\__pycache__\opencv视图\Python爬虫\图形化界面\\123.png').convert('L')
image_array=np.array(image)
#得到x方向导数矩阵
image_x=img_conv(image_array,operator_x)
#得到y方向上的导数矩阵
image_y=img_conv(image_array,operator_y)
#得到梯度矩阵
image_xy=np.sqrt(image_x**2+image_y**2)
#将梯度矩阵个元素的值归一为0~255
image_xy=(255.0/image_xy.max())*image_xy
plt.subplot(2,2,1)
plt.imshow(image_array,cmap=plt.cm.gray)
plt.axis('off')
plt.subplot(2,2,2)
plt.imshow(image_x,cmap=plt.cm.gray)
plt.axis('off')
plt.subplot(2,2,3)
plt.imshow(image_y,cmap=plt.cm.gray)
plt.axis('off')
plt.subplot(2,2,4)
plt.imshow(image_xy,cmap=plt.cm.gray)
plt.axis('off')
plt.show()



Prewitt算子虽然可以检测出图像边缘,但是结果较为粗糙,图像带有大量高频噪声。下面我们可以介绍更为精细的算法。


Sobel算子


Sobel算子是典型的边缘检测一阶微分算子。它利用像素临近区域的梯度值来计算1个像素的梯度值,然后根据一定的绝对值来取舍。在技术上他是离散性的差分算子,用于计算图像亮度函数的梯度近似值。由于Sobel算子中引入了类似局部平均的运算,因此对噪声具有平滑作用,能很好地消除噪声影响。Sobel算子对于像素的位置的影响进行了加权,与Prewitt算子相比效果更佳。Sobel算子由两个3x3矩阵表示的卷积核组成,通常其中一个对垂直边缘响应最大,另一个则对水平边缘响应最大。两个卷积核分别代表水平和垂直方向的算子,将其与原图像进行卷积运算,即可分别得到水平与垂直方向的亮度差分近似值。实际使用中,常用如下两个算子对图像边缘进行检测:

检测水平方向的Sobel算子:8f3080a2390ed0a4f9f2c1db2673fca5_35a95de7ee87456098e98bb32d845557.png

检测垂直水平方向的Sobel算子:0c13d5b0017d2fc2855f237f84531087_e14dd0b636f64876a77df8fcca891613.png

图像的每一个像素的横向及纵向梯度近似值可以用以下公式来计算其大小:

G=sqrt(Gx²+Gy²)(sqrt表示开方)

然后用以下的公式计算梯度值:

β=arctan(Gx/Gy)

如果β的值为0,则表示图像在该处拥有垂直边缘,左方较右方暗。利用Sobel算子进行边缘检测示例代码:


#利用Sobel算子进行边缘检测
import numpy as np #算子矩阵处理
from PIL import Image  #图片导入
import matplotlib.cm as cm  #用于色彩映射
import scipy.signal as signal  #使用signal中的convolve2d卷积算法
import matplotlib.pyplot as plt #绘图
#定义x方向的Sobel算子
operator_x=np.array([[-1,0,1],[-2,0,2],[-1,0,1]])
#定义y方向的sobel算子
operator_y=np.array([[-1,-2,-1],[0,0,0],[1,2,1]])
#打开图像并将其转化为灰度图像
Image=Image.open('D:\Python\.vscode\__pycache__\.vscode\__pycache__\opencv视图\Python爬虫\图形化界面\\123.png').convert('L')
#转换成图像矩阵
image_array=np.array(Image)
#x方向的导数矩阵
image_x=signal.convolve2d(image_array,operator_x,mode='same') #标签:full,valid,same
image_y=signal.convolve2d(image_array,operator_y,mode='same')
#得到梯度矩阵
image_xy=np.sqrt(image_x**2+image_y**2)
#将梯度矩阵归一化为0~255
image_xy=image_xy*(255/image_xy.max())
#输出边缘检测图像
plt.subplot(2,2,1)
plt.imshow(image_array,cmap=cm.gray)
plt.axis('off')
plt.subplot(2,2,2)
plt.imshow(image_x,cmap=cm.gray)
plt.axis('off')
plt.subplot(2,2,3)
plt.imshow(image_y,cmap=cm.gray)
plt.axis('off')
plt.subplot(2,2,4)
plt.imshow(image_xy,cmap=cm.gray)
plt.axis('off')
plt.show()



除了上述的通过Sobel算子卷积运算进行图像边缘检测。我们也可以通过Opencv中自带的Sobel函数来进行图像检测,示例代码如下:


#基于opencv中的sobel算子函数
import cv2
import numpy as np
from PIL import Image
#读取原图
#Image=Image.open('D:\Python\.vscode\__pycache__\.vscode\__pycache__\opencv视图\Python爬虫\图形化界面\\123.png').convert('L')
image=cv2.imread('D:\Image\one.jpg')
#将图像转换为灰度图像
image=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow('Original',image)
cv2.waitKey() #等待按键
'''
Sobel边缘检测,其中SobelX为x方向导数图像,SobelY为y方向导数图像,SobelCombined为梯度图像
'''
SobelX=cv2.Sobel(image,cv2.CV_64F,1,0)
SobelY=cv2.Sobel(image,cv2.CV_64F,0,1)
#x方向梯度的绝对值
SobelX=np.uint8(np.absolute(SobelX))
#y方向梯度的绝对值
SobelY=np.uint8(np.absolute(SobelY))
sobelCombined=cv2.bitwise_or(SobelX,SobelY)
cv2.imshow('Sobel X',SobelX)
cv2.waitKey()
cv2.imshow('Sobel Y',SobelY)
cv2.waitKey()
cv2.imshow('Sobel Combined',sobelCombined)
cv2.waitKey()



从这两种方法的检测结果可以看出,Sobel算子的图像边缘检测结果也十分模糊,Sobel算子并没有将图像的主体与背景严格分开,换而言之,Sobel算子并没有基于图像灰度进行处理。由于Sobel算子并没有严格的模拟人类的视觉生理特征,所以提取的图像轮廓并不能让人满意。

相关文章
|
2月前
|
机器学习/深度学习 算法 TensorFlow
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
动物识别系统。本项目以Python作为主要编程语言,并基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集4种常见的动物图像数据集(猫、狗、鸡、马)然后进行模型训练,得到一个识别精度较高的模型文件,然后保存为本地格式的H5格式文件。再基于Django开发Web网页端操作界面,实现用户上传一张动物图片,识别其名称。
92 1
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
|
5月前
|
机器学习/深度学习 人工智能 算法
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
海洋生物识别系统。以Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经网络算法,通过对22种常见的海洋生物('蛤蜊', '珊瑚', '螃蟹', '海豚', '鳗鱼', '水母', '龙虾', '海蛞蝓', '章鱼', '水獭', '企鹅', '河豚', '魔鬼鱼', '海胆', '海马', '海豹', '鲨鱼', '虾', '鱿鱼', '海星', '海龟', '鲸鱼')数据集进行训练,得到一个识别精度较高的模型文件,然后使用Django开发一个Web网页平台操作界面,实现用户上传一张海洋生物图片识别其名称。
187 7
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
|
5月前
|
机器学习/深度学习 人工智能 算法
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
乐器识别系统。使用Python为主要编程语言,基于人工智能框架库TensorFlow搭建ResNet50卷积神经网络算法,通过对30种乐器('迪吉里杜管', '铃鼓', '木琴', '手风琴', '阿尔卑斯号角', '风笛', '班卓琴', '邦戈鼓', '卡萨巴', '响板', '单簧管', '古钢琴', '手风琴(六角形)', '鼓', '扬琴', '长笛', '刮瓜', '吉他', '口琴', '竖琴', '沙槌', '陶笛', '钢琴', '萨克斯管', '锡塔尔琴', '钢鼓', '长号', '小号', '大号', '小提琴')的图像数据集进行训练,得到一个训练精度较高的模型,并将其
75 0
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
|
2月前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
119 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
2月前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
108 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
2月前
|
机器学习/深度学习 移动开发 TensorFlow
随着人工智能技术的迅速发展,图像识别在各个领域的应用越来越广泛
我们开发了一款基于Python和TensorFlow的果蔬识别系统,利用CNN模型高效识别12种常见果蔬,提升饮食健康与食材管理。该系统通过图像预处理与增强提高模型鲁棒性,并借助Django搭建Web平台,提供便捷的图片上传识别功能。项目不仅展示了深度学习在图像识别中的潜力,还为相关研究奠定了基础。更多详情及演示视频请访问:[项目链接](https://www.yuque.com/ziwu/yygu3z/pnrng41h0sg5f5tf)。
67 0
|
3月前
|
机器学习/深度学习 人工智能 算法
【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+TensorFlow
眼疾识别系统,使用Python作为主要编程语言进行开发,基于深度学习等技术使用TensorFlow搭建ResNet50卷积神经网络算法,通过对眼疾图片4种数据集进行训练('白内障', '糖尿病性视网膜病变', '青光眼', '正常'),最终得到一个识别精确度较高的模型。然后使用Django框架开发Web网页端可视化操作界面,实现用户上传一张眼疾图片识别其名称。
81 9
【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+TensorFlow
|
3月前
|
机器学习/深度学习 人工智能 自动驾驶
【人工智能】图像识别:计算机视觉领域的识别与处理资源概览
在快速发展的科技时代,计算机视觉(Computer Vision, CV)作为人工智能的一个重要分支,正深刻改变着我们的生活与工作方式。图像识别作为计算机视觉的核心任务之一,旨在让机器能够理解和解释数字图像或视频中的内容,进而执行诸如目标检测、图像分类、场景理解等复杂任务。本文将深入探讨图像识别领域的关键技术、常用数据集、开源框架及工具资源,为从事或关注该领域的专业人士提供一份全面的指南。
82 2
|
4月前
|
机器学习/深度学习 人工智能 算法
【服装识别系统】图像识别+Python+人工智能+深度学习+算法模型+TensorFlow
服装识别系统,本系统作为图像识别方面的一个典型应用,使用Python作为主要编程语言,并通过TensorFlow搭建ResNet50卷积神经算法网络模型,通过对18种不同的服装('黑色连衣裙', '黑色衬衫', '黑色鞋子', '黑色短裤', '蓝色连衣裙', '蓝色衬衫', '蓝色鞋子', '蓝色短裤', '棕色鞋子', '棕色短裤', '绿色衬衫', '绿色鞋子', '绿色短裤', '红色连衣裙', '红色鞋子', '白色连衣裙', '白色鞋子', '白色短裤')数据集进行训练,最后得到一个识别精度较高的H5格式模型文件,然后基于Django搭建Web网页端可视化操作界面,实现用户在界面中
129 1
【服装识别系统】图像识别+Python+人工智能+深度学习+算法模型+TensorFlow
|
4月前
|
机器学习/深度学习 人工智能 算法
【坚果识别】果实识别+图像识别系统+Python+计算机课设+人工智能课设+卷积算法
坚果识别系统,使用Python语言进行开发,通过TensorFlow搭建卷积神经网络算法模型,对10种坚果果实('杏仁', '巴西坚果', '腰果', '椰子', '榛子', '夏威夷果', '山核桃', '松子', '开心果', '核桃')等图片数据集进行训练,得到一个识别精度较高的模型文件,让后使用Django搭建Web网页端界面操作平台,实现用户上传一张坚果图片 识别其名称。
51 0