人工智能图像形状检测算法(二)

简介: 人工智能图像形状检测算法(二)

几何形状检测


在数字图像中,往往存在一些特殊形状的几何图形,例如人眼瞳孔的圆形,建筑物立面的直线等。在图像处理与识别中,物体的形状属于高级信息,而基本几何形状是图像目标的主要特征之一,在数字图像中对其进行准确的检测有重要意义。


Hough算法


Hough变换是一种常用的几何图形检测算法,其基本原理是将特定图形上的点变换到一组参数空间上,然后根据参数空间点的累加结果找到一个极大值对应的解,而这个解正对应着要寻找的几何形状的参数(例如直线的斜率k与常数b,圆的圆心o与半径r等)。


74659fbcd1f76dac353d5950aaea36e2_24863af849a04e19b3cbb4afeb361f82.jpeg


ρ=xcosΘ+ysinΘρ=xcosΘ+ysinΘ


Hough变换算法的基本步骤:


①.将参数空间(ρ,Θρ,Θ)量化,赋初值为一个二维矩阵M,M(ρ,θ)就成了一个累加器。


②.对图像边界上的每一个点进行变换,变换后属于那一组(ρ,θ),就把该组(ρ,θ)对应的累加器数加1,这里需要变换的点就是上面说的经过边缘提取以后的图像。


③.处理完成所有点后,分析得到的M(ρ,θ),设置一个阈值T,当M(ρ,θ)>T,就认为存在一条有意义的直线。


④.有了M(ρ,θ)和点p(x,y),我们就可以计算出对应的直线。


直线检测


OpenCV内置的置于Hough算法的直线检测函数有标准Hough变换函数HoughLines()和统计Hough变换函数HoughLinesP(),二者的参数和用法基本一致。我们的示例代码以HoughLinesP()函数为例。


函数原型:


HoughLinesP(image,rho,theta,threshold[,lines[,minLineLength[,maxLineGap]]])


参数说明如下:


(1)image:8比特单通道灰度原图


(2)rho:极坐标参数距离分辨率,即ρ的精度。


(3)theta:极坐标参数角度分辨率,即θ的精度


(4)threshold:设定的阈值,大于此阈值的线段才可以被检测通过并返回到结果中。值越大,意味着检测出的线段越长,检测出的线段个数越少。


(5)lines:函数返回的矢量,包含所有键的到的直线的参数。


(6)minLineLength:线段的最小长度


(7)maxLineGap:点到直线被允许的最大距离。


基于Hough变换算法的图像直线检测示例代码:


#形状检测
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('D:\Image\\four.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转化为灰度图像
#对图像进行Canny边缘检测
edges=cv2.Canny(gray,50,200) #基于Canny算子的图像边缘检测
plt.subplot(121)
plt.imshow(edges,'gray')
plt.xticks([])
plt.yticks([])
#基于统计Hough变换的直线检测
lines=cv2.HoughLinesP(edges,1,np.pi/180,30,minLineLength=60,maxLineGap=10)
lines1=lines[:,0,:]#返回包含检测到的所有直线的二维矩阵
for x1,y1,x2,y2 in lines1[:]:
    cv2.line(img,(x1,y1),(x2,y2),(255,255,0),1) #在图像中用黄色的线标记检测出的直线
plt.subplot(122)
plt.imshow(img,)
plt.xticks([])
plt.yticks([])
plt.show()


结果展示:


84961ce99bad61f4f958c22d2cc536fa_33d2469d139a4bd4964675fd7476f930.png


根据图像显示,黄色标记的为直线,图像检测结果较为准确,但是依然存在部分重叠,这就需要程序员根据自己的需要调参数。


圆检测


对于圆的检测,我们知道圆的数学方程为:


(x−xcenter)2+(y−ycenter)2=r2(x−xcenter)2+(y−ycenter)2=r2


因此,一个圆的确定至少需要3个参数,那么Hough变换的累加器必须是三维的,需要通过三层循环来实现,从而把图像上的所有点映射到三维参数空间上。理论上,圆的检测比直线检测费时,不过OpenCV进行了优化。


函数原型即其参数说明:


cv2.HoughCircles(image,method,dp,minDist[, circles[,param1, param2[,minRadius[,maxRadius]]]]])


(1). image 不用多说,输入矩阵

(2).method cv2.HOUGH_GRADIENT 也就是霍夫圆检测,梯度法

(3).dp 计数器的分辨率图像像素分辨率与参数空间分辨率的比值(官方文档上写的是图像分辨率与累加器分辨率的比值,它把参数空间认为是一个累加器,毕竟里面存储的都是经过的像素点的数量),dp=1,则参数空间与图像像素空间(分辨率)一样大,dp=2,参数空间的分辨率只有像素空间的一半大

(4).minDist 圆心之间最小距离,如果距离太小,会产生很多相交的圆,如果距离太大,则会漏掉正确的圆

(5).param1 canny检测的双阈值中的高阈值,低阈值是它的一半

(6).param2 最小投票数(基于圆心的投票数)

(7).minRadius 需要检测院的最小半径

(8).maxRadius 需要检测院的最大半径


基于Hough算法的圆形图像检测示例代码:


#圆形检测
import numpy as np
import cv2
import matplotlib.pyplot as plt
img=cv2.imread('D:\Image\circle.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
plt.subplot(121)
plt.imshow(gray,'gray')
plt.xticks([])
plt.yticks([])
#基于Hough算法的圆形检测
circles1=cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,100,param1=100,param2=30,minRadius=150,maxRadius=200)
circles=circles1[0,:,:] #返回检测道德圆的参数
circles=np.uint16(np.around(circles)) #四舍五入,取整
for i in circles[:]:
    cv2.circle(img,(i[0],i[1]),i[2],(255,0,0),5) #画圆
    cv2.circle(img,(i[0],i[1]),2,(255,0,255),10) #画圆心
plt.subplot(122)
plt.imshow(img)
plt.xticks([])
plt.yticks([])
plt.show()


973e01affd01200e47c0b5de927650e1_127610a7fdfa4a07aada14e2660b48f2.png


标记内圆则需要更改参数(minRadius,maxRadius),这里更改参数后的标记如图:


6969bf2571fdddfbc8c66bb9dfe96b46_c621dbcc7fb545a3b57f7471f8b5d9d6.png


尺度不变特征变换


尺度不变特征转化(Scale-Invariant Feature Transform,SIFT)是用于图像处理的一种算法,是一种局部特征描述算子,具有尺度不变性,可在图像中检测出关键点。


该算法于1999年由戴维·劳(David Lowe)在计算机视觉国际会议(International Conference on Computer Vision,ICCV)中首次提出,2004年,他再次整理完善后将相关论文发表于国际计算机视觉杂志(International Journal of Computer Vision,IJCV)。SIFT算法是用于提取图像局部特征的经典算法,其实质是在不同的尺度空间查找关键点(特征点),并计算出关键点的方向。SIFT所查找的关键点是一些十分突出,不会因光照,仿射变换(Affine Transformation)和噪声等因素而变化的点,如角点,边缘点,暗区的亮点及亮区的暗点等。


OpenCV内置了SIFT算法的诸多函数,包括示例化SIFT类的cv2.xfeatures2d.SIFT_create().


在图像中查找关键点的sift.detect(gray,None),计算找到关键点的描述符的sift.compute(grag,kp)以及在图中画出关键点的cv2.drawKeypoints(gray,kp,img)。


示例代码如下:


#尺度不变特征变换
import cv2
import numpy as np
from matplotlib import pyplot as plt
def getSift():
    '''
    定义函数用于查看SIFT特征
    '''
    img_path1='D:\Image\girl.jpg'
    img=cv2.imread(img_path1)
    #将其转换为灰度图像
    img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    #创建SIFT的类
    sift=cv2.SIFT_create() #版本改进,原来的函数为xdefaures2d.SIFT_create()
    #在图像中找到关键点
    kp=sift.detect(img_gray,None)
    #keypoint数据分析
    print(kp[0].pt)
    #计算每个关键点的SIFT特征
    des=sift.compute(img_gray,kp)
    print(type(kp),type(des))
    #des[0]为关键点的list,des[1]为特征向量的矩阵
    print(type(des[0]),type(des[1]))
    print(des[0],des[1])
    print(des[1].shape)
    #在灰度图像中找出这些点
    img=cv2.drawKeypoints(img_gray,kp,np.array([]),(255,0,0),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    plt.imshow(img)
    plt.show()
getSift()



找到了关键点,那我们也就可以对两张图片进行匹配,shiyongSIFT算法进行图像匹配示例代码:


import cv2
from matplotlib import pyplot as plt
img1=cv2.imread('D:\Image\\temp1.jpg',0) #载入第一幅图像
img2=cv2.imread("D:\Image\\temp2.jpg",0) #第二幅
#初始化SIFT检测器
sift=cv2.SIFT_create()
#通过SIFT检测找到关键点kp和描述子des
kp1,des1=sift.detectAndCompute(img1,None)
kp2,des2=sift.detectAndCompute(img2,None)
#蛮力匹配算法,有两个参数,距离度量(L2(default),L1),是否交叉匹配(默认为False)
bf=cv2.BFMatcher()
#返回k个最佳匹配
matches=bf.knnMatch(des1,des2,k=2)
good=[]
for m,n in matches:
    if m.distance<0.75*n.distance:
        good.append([m])
img3=cv2.drawMatchesKnn(img1,kp1,img2,kp2,good[:10],None,flags=2)
plt.imshow(img3)
plt.show()


相关文章
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
【自然语言处理】TF-IDF算法在人工智能方面的应用,附带代码
TF-IDF算法在人工智能领域,特别是自然语言处理(NLP)和信息检索中,被广泛用于特征提取和文本表示。以下是一个使用Python的scikit-learn库实现TF-IDF算法的简单示例,并展示如何将其应用于文本数据。
162 65
|
14天前
|
机器学习/深度学习 人工智能 算法
【深度学习】python之人工智能应用篇——图像生成技术(二)
图像生成是计算机视觉和计算机图形学领域的一个重要研究方向,它指的是通过计算机算法和技术生成或合成图像的过程。随着深度学习、生成模型等技术的发展,图像生成领域取得了显著的进步,并在多个应用场景中发挥着重要作用。
22 9
|
14天前
|
机器学习/深度学习 人工智能 自然语言处理
【图像生成技术】人工智能在医疗健康领域的应用实例:图像生成技术的革新实践
在当今医疗健康的前沿阵地,人工智能(AI)技术正以前所未有的速度重塑着医疗服务的面貌,其中图像生成技术尤其在提升诊断精度、优化治疗策略及增强医疗教育方面展现出了巨大潜力。以下将通过一个简化的示例,展示如何利用深度学习模型,特别是生成对抗网络(GANs),来生成医学图像,并讨论其在实际医疗场景中的应用价值。
35 6
|
14天前
|
机器学习/深度学习 人工智能 搜索推荐
【图像生成技术】人工智能在广告营销的革新:图像生成技术的应用与实践代码示例
随着人工智能技术的飞速发展,广告营销行业迎来了前所未有的变革。图像生成技术,作为AI领域的一颗璀璨明星,正被广泛应用于创造个性化、高吸引力的产品展示图、海报乃至宣传视频,以精准对接目标受众,显著提升广告的转化率和整体营销效果。本文将深入探讨这一技术的应用场景,并通过一个简单的代码示例,展示如何利用深度学习框架TensorFlow来实现创意图像的自动生成。
31 4
|
13天前
|
人工智能 自然语言处理 算法
【人工智能】TF-IDF算法概述
TF-IDF算法,全称Term Frequency-Inverse Document Frequency(词频-逆文档频率),是一种在信息检索和文本挖掘领域广泛应用的加权技术。它通过评估一个词语在文档中的重要程度,来挖掘文章中的关键词,进而用于文本分析、搜索引擎优化等场景。其核心思想是:如果某个词或短语在一篇文章中出现的频率高(TF高),且在其他文章中很少出现(IDF也高),则认为这个词或短语具有很好的类别区分能力,适合用来代表这篇文章的内容。 具体而言,TF-IDF由两部分组成,即词频(TF)和逆文档频率(IDF)。词频(TF)指的是某一个给定的词在该文件中出现的频率。这个数值通常会被归一化
10 3
|
17天前
|
机器学习/深度学习 监控 算法
目标检测算法技术
8月更文挑战第11天
|
13天前
|
机器学习/深度学习 人工智能 算法
【人工智能】线性回归模型:数据结构、算法详解与人工智能应用,附代码实现
线性回归是一种预测性建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系。这种关系可以表示为一个线性方程,其中因变量是自变量的线性组合。
30 2
|
14天前
|
机器学习/深度学习 人工智能 算法
【人工智能】传统语音识别算法概述,应用场景,项目实践及案例分析,附带代码示例
传统语音识别算法是将语音信号转化为文本形式的技术,它主要基于模式识别理论和数学统计学方法。以下是传统语音识别算法的基本概述
32 2
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能算法原理
人工智能(AI)属计算机科学,聚焦于模拟人类智慧的技术与系统的研发。本文概览常见AI算法原理:机器学习含监督(如决策树、支持向量机)、无监督(如聚类、主成分分析)及强化学习算法;深度学习涉及卷积神经网络、循环神经网络和生成对抗网络;自然语言处理涵盖词袋模型、循环神经网络语言模型及命名实体识别等。这些算法支撑着AI技术的广泛应用与发展。
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
探索计算机人工智能算法
在信息科技飞速发展的今天,人工智能(AI)炙手可热。计算机AI算法作为核心,使系统能模拟乃至超越人智。本文探索AI算法原理,涵盖机器学习(监督与无监督学习)、深度学习及自然语言处理等关键技术,展示其如何通过数据分析、模式识别等实现预测、分类及理解人类语言等复杂任务,引领科技创新潮流。
下一篇
云函数