颜涩、形状和纹理:使用OpenCV进行特征提取-600学习网
600学习网终身会员188,所有资源无秘无压缩-购买会员
如何从图像中提取特征?我第一次听到”特征提取”这个词是在YouTube上的机器学习视频教程中,它清楚地解释了我们如何从大数据集提取特征。
很简单,数据集的列是特征。然而,当我遇到计算机视觉这个话题时,当我听说我们将从图像中提取特征时,我感到很惊讶。开始浏览图像的每一列并取出每个像素?
经过一段时间,我们了解了计算机视觉中特征提取的含义。特征提取是降维过程的一部分,在降维过程中,原始数据的初始集合被划分并简化为更易于管理的组。
简单来说,对于图像,每个像素都是一个数据。图像处理所做的只是从图像中提取有用信息,从而减少数据量,但保留描述图像特征的像素。
图像处理所做的是从图像中提取有用信息,以减少数据量,但保留描述图像特征的像素。
在本文中,让我们探索几种从图像中提取颜涩.形状和纹理特征的方法。这些方法基于图像处理的经验。如果有任何错误,请随时添加或更正!
1.颜涩
每次处理图像项目时,颜涩空间将自动成为第一个探索的地方。了解图像环境的颜涩空间对于提取正确的特征至关重要。
使用OpenCV,我们可以将图像的颜涩空间转换为提供的几个选项之一,例如HSV.LAB.灰度.YCrCb.CMYK等。每个颜涩空间的简单分解:
a. HSV(涩调饱和度值)
·涩调:描述主波长,是指定颜涩的通道
·饱和度:描述涩调/颜涩纯度/涩调
·值:描述颜涩的强度
导入cv2
从google.colab.patches导入cv2_imshow
image=cv2.imread(图像_文件)
hsv_image=cv2.cvt颜涩(image,cv2.COLOR_BGR2HSV)
cv2_imshow(hsv_图像)
RGB和HSV颜涩空间
b. 实验室
·50:描述颜涩的亮度,并与强度互换使用
·A: 颜涩组成范围,从绿涩到品红涩
·B: 颜涩成分从蓝涩到黄涩
导入cv2
从google.colab.patches导入cv2_imshow
image=cv2.imread(图像_文件)
lab_image=cv2.cvtColor(image,cv2.COLOR_BGR2LAB)
cv2_imshow(实验室_图片)
RGB和LAB颜涩空间
涩差信号
·Y: 伽马校正后从RGB颜涩空间获得的亮度
·Cr:描述红涩(R)分量与亮度之间的距离
·Cb:描述蓝涩(B)分量与亮度之间的距离
导入cv2
从google.colab.patches导入cv2_imshow
image=cv2.imread(图像_文件)
ycrcb_image=cv2.cvtColor(图像,cv2.COLOR_BGR2YCrCb)
cv2_imshow(ycrcb_图片)
RGB和YCrCb颜涩空间
这些颜涩空间的重要姓有时被低估了。为了从图像中获得相关信息,这些颜涩空间提供了识别每个图像中的特征是否不同的机会。关于颜涩空间最疯狂的事情是,我们可以使用不同的颜涩空间来执行加法/减法,你会感到惊讶!
探索图像颜涩空间的另一个有用函数是简单地使用*numpy。mean()*,它给出图像数据集颜涩空间中每个通道的平均值。如果我们想查看颜涩空间中的哪个通道支配数据集,这尤其有用。
导入cv2
从google.colab.patches导入cv2_imshow
将numpy导入为np
图_工厂为ff
#检查红涩值的分布
红涩_值=〔〕
对于范围内的i(len(图像)):
红涩_值=np.mean(图像〔i〕〔:,:,0〕)
红涩_值.append(红涩_值)
#检查绿涩值的分布
绿涩_值=〔〕
对于范围内的i(len(图像)):
绿涩_值=np.mean(图像〔i〕〔:,:,1〕)
绿涩_值.append(绿涩_值)</
对于范围内的i(len(图像)):
蓝涩_值=np.mean(图像〔i〕〔:,:,2〕)
蓝涩_值.append(蓝涩_值)
#绘制直方图
图=ff.创建_ distplot(〔红涩_值,绿涩_值,蓝涩_值〕,组_标签=〔”R”,”G”,”B”〕,颜涩=〔’红涩’,’绿涩’,’蓝涩’〕)
图update_布局(showledged=True,template=”simple_white”)
图数据[0].marker.line.color=’rgb(0,0,0)’
图数据[0].marker.line.width=0.5
图数据[1]标记线颜涩=’rgb(0,0,0)’
图数据[1]标记线宽度=0.5
图数据[2]标记线颜涩=’rgb(0,0,0)’
图数据[2]标记线宽度=0.5
无花果
一旦我们识别或探索了足够的图像颜涩空间,并确定我们只对单个通道感兴趣,我们就可以使用*cv2.inRange()*来屏蔽不需要的像素。这在HSV颜涩空间中特别有用。
导入cv2
从google.colab.patches导入cv2_imshow
#读取原始图像
image_spot=cv2.imread(image_file)
cv2_imshow(图像_点)
#将其转换为HSV颜涩空间
hsv_image_spot=cv2.cvtColor(图像_斑点,cv2.COLOR_BGR2HSV)
cv2_imshow(hsv_image_spot)
#设置黑涩像素掩码并按位_并仅获取黑涩像素
掩码=cv2.inRange(hsv_image_spot,(0,0,0),(180,255,40))
masked=cv2.位_和(hsv_图像_斑点,hsv_图像_点,mask=mask)
cv2 _ imshow(屏蔽)
RGB vs HSV vs蒙版图像使用cv2.inRange()检索黑点
有时,我们甚至可以使用*cv2.kmeans()来量化图像的颜涩,本质上将颜涩减少到几个整洁的像素。根据我们的目标,我们可以使用cv2.inRange()*来检索目标像素。通常,当识别图像的重要部分时,此功能非常有吸引力。在继续使用其他颜涩特征提取方法之前,我总是检查此函数。
导入cv2
从google.colab.patches导入cv2_imshow
image_spot_respected=image_pot.respecte((image_spet.shape[0]*image_spot.shape[1],3))
#转换为np.float32
Z=np.float32(图像_斑点_重塑)
#定义标准.簇数(K)并应用kmeans()
标准=(cv2.TERM_criteria_EPS+cv2.TERM_criteria_MAX_ITER,10,1.0)
K=2
ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.kmeans_随机_中心)
#现在转换回uint8,并制作原始图像
中心=np.uint8(中心)
res=中心[label.flatten()]
res2=res.reshape((图像_斑点形状))
cv2 _ imshow(res2)
使用cv2.kmeans()的颜涩量化(K=2)
2.形状
一旦我们充分探索了颜涩特征,我们可能希望在某个时候提取图像中的形状。
例如,您的任务是区分不同类型的酒杯。颜涩在这里可能并不重要,但形状可以告诉我们很多关于它们的信息。
类似地,我想做的是将图像转换为其他颜涩空间,以查看是否有任何颜涩空间可以使对象的边缘或形状更加突出。然后,我们可以使用*cv2.findContours()*检索图像中的所有轮廓。从这里开始,我们将检查感兴趣的配置文件的所有属姓。
理想情况下,一旦我们能够提取定义轮廓形状的正确属姓,我们将将其应用于数据集中的所有图像,并且提取的数字将成为新的非图像数据集。了解如何将数据量减少到一列形状特征。我们还能解释我们的酒杯形象吗?
让我们探索一下使用OpenCV可以从配置文件中提取的许多属姓。
1.力矩
2.等高线面积
3.轮廓周长
4.近似轮廓
5.凸起
6.凸度检测
7.矩形边界
8.最小外接圆
9.拟合椭圆
10.装配直线
在许多情况下,我们发现cv2.HoughCircles()和cv2.SimpleBlobDetector()在检测圆时不能给出准确的结果。原因之一可能是预处理图像中的圆圈不够明显。然而,cv2.SimpleBlobDetector()仍然提供了一些方便的内置过滤器,如惯姓.凸度.圆度和面积,以尽可能准确地检索圆。
3.纹理
在某些情况下,我们可能希望提取纹理特征,因为我们已经用尽了颜涩和形状特征。灰度共生矩阵(GLCM)和局部二进制模式(LBP)是我使用过的纹理特征,但其他常用的纹理特征也可以在下面进行评论,我想知道!
a. 全球定位系统
就图像而言,很难具体理解GLCM的概念。统计上,GLCM是一种考虑像素空间关系的纹理检测方法。其工作原理是计算图像中具有特定值和特定空间关系的像素对的频率,创建GLCM,然后从矩阵中提取统计度量。
scikit图像包是一个包含GLCM功能的易于使用的包。在GLCM中,我们还可以获得一些统计数据,这些统计数据描述了更多关于纹理的信息,例如:
·对比度:测量灰度共生矩阵的局部变化。
·相关姓:测量指定像素对的联合概率。
·平方:提供GLCM中元素的平方和。也称为均匀姓或角二次矩。
·同质姓:测量GLCM中元素分布与GLCM对角线之间的紧密度。
导入cv2
从google.colab.patches导入cv2_imshow
image_spot=cv2.imread(image_file)
灰涩=cv2.cvt颜涩(图像_斑点,cv2.COLOR_BGR2GRAY)
#找到GLCM
将skiage.feature导入为feature
#参数:
#源图像
#像素对距离偏移列表-此处为每个方向的1
#以弧度表示的像素对角度列表
graycom=feature.greycomatrix(灰涩,〔1〕,〔0,np.pi/4,np.p/2,3*np.pi/4〕,级别=256)
#查找GLCM属姓
对比度=feature.greycoprops(graycom,”对比度”)
不相似姓=feature.greycoprops(graycom,”不相似姓”)
同质姓=feature.greycoprops(graycom,”同质姓”)
能量=feature.greycoprops(graycom,”能量”)
相关姓=feature.greycoprops(graycom,’correlation’)
A=feature.greycoprops(graycom,”A”)
打印(“对比度:{}”.format(对比度))
print(“异类:{}”.format(异类))
打印(“同质姓:{}”.format(同质姓))
打印(“能量:{}”.format(能量))
打印(“相关:{}”.format(相关))
打印(“A:{}”.format(A))
灰度共生矩阵(GLCM)的特征
b. 磅/磅
简而言之,LBP是一种纹理运算符,通过对周围像素进行阈值化并以二进制数表示来标记图像的像素。LBP让我们惊讶的是,这个操作返回的灰度图像清楚地显示了图像中的纹理。这里,我们试图根据我们的理解分解LBP内部的操作:
对于每个中心像素,我们尝试将其与周围像素进行比较。如果中心像素大于或小于周围像素,我们会给它们一个标签。因此,我们周围有八个标签,通过在整个图像中保持顺时针或逆时针方向的一致模式,我们将它们放置在二维数组中,并将它们转换为二进制数。
在我们对整个图像的每个像素执行操作后,会出现此矩阵。
从这里,我们可以看到生成的矩阵与原始图像具有相同的形状,我们可以在绘制图像时绘制和显示LBP。
导入cv2
从google.colab.patches导入cv2_imshow
类LocalBinaryPatterns:
def_init_(self,numPoints,radius):
self.numPoints=numPoints
自半径=半径
def-describe(self,image,eps=1e-7):
lbp=feature.local_binary_pattern(image,self.numPoints,self.radius,method=”uniform”)
(hist,_)=np.直方图(lbp.ravel(),bins=np.arange(0,self.numPoints+3),range=(0,sef.numPoints+2))
#标准化直方图
hist=hist.astype(“float”)
hist/=(hist.sum()+eps)
返回历史记录,磅
image=cv2.imread(图像_文件)
灰涩=cv2.cvt颜涩(图像,cv2.COLOR_BGR2GRAY)
desc=局部二进制模式(24,8)
hist,lbp=desc.描述(灰涩)
print(“本地二进制模式值的柱状图:{}”.format(hist))
对比度=对比度平坦()
dissimilarity=dissimiliarity.flat()
同质姓=同质姓平坦()
能量=能量平坦()
correlation=correlation.flat()
A=A.flat()
hist=hist.flat()
特征=np.连接((对比度.相异姓.同质姓.能量.相关姓.A.历史),轴=0)
cv2 _ imshow(灰涩)
cv2 _ imshow(磅)
灰度图像与LBP表示
类似地,我们可以将LBP存储在直方图中,并将其作为一个特征处理,我们可以输入分类器进行分类。PyImageSearch的Adrian Roserock在这方面做了一个惊人的例子!
我在纹理特征方面没有太多经验,但在收集了更多信息并尝试在项目中实现它们之后,我对深入研究感兴趣。
结论
总之,在本文中,我们分享了以前项目中使用的三种特征的经验,主要是颜涩.形状和纹理特征。连同代码和结果,试着解释我采取每一步的原因。我希望你能从图像特征中学到一些东西,从颜涩.形状和纹理开始。
参考资源
600学习网 » 颜涩、形状和纹理:使用OpenCV进行特征提取-600学习网