2019-03-04 11:07:18 xiaoheizi_du 阅读数 3233

OpenCV数字图像处理之ROI区域的提取

利用mask(掩模)技术提取纯色背景图像ROI区域中的人和物,并将提取出来的人或物添加在其他图像上。

1、实现原理

先通过cv.cvtColor()函数,将原RGB彩色图像转换为hsv色彩空间的图像,然后通过cv.inRange()函数获得ROI区域的Mask,最后利用cv.bitwise()函数提取得到ROI区域。

2、使用的函数简述

(1) cv.cvtColor(img, cv.COLOR_BGR2HSV)函数

img为要进行色彩空间转换的原图
cv.COLOR_BGR2HSV即将原图RGB色彩空间转换为HSV色彩空间

(2) cv.inRange(hsv, (h_min, s_min, v_min), (h_max, s_max, v_max))函数

cv.inRange函数通过设置不同的h、s、v的min和max阈值可以获取不同色彩的一个二值的mask图,下图为各颜色的阈值表:
在这里插入图片描述

(3)cv.bitwise_and(img1, img2, mask)cv.bitwise_or(img1, img2, mask)cv.bitwise_not(img)

第一个函数为按位与操作函数,将img1和img2在mask的区域内,R,G,B三个分量分别进行按位与操作。第二个函数为按位或操作函数,将img1和img2在mask的区域内,R,G,B三个分量分别进行按位或操作。第三个函数为按位取反操作函数,将img在R,G,B三个分量分别进行按位取反操作。

(4)cv.add(img1, img2)函数

将img1和img2 进行相加操作,img1和img2的尺寸必须要相同。

3、代码实现过程

原图如下:
在这里插入图片描述
如图,要从图中提取出卡通人物,并将其贴在其他背景上。

(1)读入原始图像

src = cv.imread('person.jpg')
cv.imshow('src', src)

在这里插入图片描述

(2)获取mask

hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)       # 转换成hsv色彩风格
mask = cv.inRange(hsv, (35, 43, 46), (99, 255, 255))   # 利用inRange产生mask
cv.imshow('mask1', mask)

由于背景为绿色,可以提取绿色背景的mask,由上表可以查出绿色和青色的值,设置好参数后,就可以获得mask(白色区域才是mask区域):
在这里插入图片描述
注意:这里获取的mask为背景的mask,我们要获得人物的mask。

(3)获取人物mask

通过逻辑非操作取反,即可获得人物的mask区域(白色区域):

mask = cv.bitwise_not(mask)
cv.imshow('mask2', mask)

在这里插入图片描述

(4)获取人物

将原始图像与原始图像在mask区域进行逻辑与操作,即可获取

timg1 = cv.bitwise_and(src, src, mask=mask)
cv.imshow('timg1', timg1)

在这里插入图片描述
以上操作即提取了图像中的ROI(卡通人)区域,下面介绍将介绍将提取出来的图贴到其他背景上。

(5)新建一张与原始图一样大小的蓝色的背景图

background = np.zeros(src.shape, src.dtype)
background[:,:,0] = 255

(6)得到蓝色背景的mask

mask = cv.bitwise_not(mask)
dst = cv.bitwise_or(timg1, background, mask=mask)
cv.imshow('dst1', dst)

在这里插入图片描述

(7)将人物图贴到蓝色背景上

dst = cv.add(dst, timg1)
cv.imshow('dst2', dst)

在这里插入图片描述

4、整体代码

import cv2 as cv
import numpy as np

src = cv.imread('person.jpg')
cv.imshow('src', src)
hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)       # 转换成hsv色彩风格
mask = cv.inRange(hsv, (35, 43, 46), (99, 255, 255))        # 利用inRange产生mask
cv.imshow('mask1', mask)
cv.imwrite('mask1.jpg', mask)

# 获取mask
mask = cv.bitwise_not(mask)
cv.imshow('mask2', mask)
cv.imwrite('mask2.jpg', mask)
timg1 = cv.bitwise_and(src, src, mask=mask)
cv.imshow('timg1', timg1)
cv.imwrite('timg1.jpg', timg1)

# 生成背景
background = np.zeros(src.shape, src.dtype)
background[:,:,0] = 255

# 将人物贴到背景中
mask = cv.bitwise_not(mask)
dst = cv.bitwise_or(timg1, background, mask=mask)
cv.imshow('dst1', dst)
cv.imwrite('dst1.jpg', dst)

dst = cv.add(dst, timg1)
cv.imshow('dst2', dst)
cv.imwrite('dst2.jpg', dst)

cv.waitKey(0)
cv.destroyAllWindows()
参考

OpenCV学习笔记——HSV颜色空间超极详解&inRange函数用法及实战

2017-06-15 17:26:12 qq_22625309 阅读数 1723


图像ROI(region of intrest:感兴趣区域)的提取往往是图像处理中的第一步,而且也是非常关键的一步,ROI区域的提取能够在消除一些噪

声的同时减少后续图像处理的数据量,是非常常用的方法。

在OPENCV中可以利用数据结构Rect 来提取ROI区域,具体用法示例如下:

int main()
{
	Mat image = imread("sources/1.bmp", 0);
	Rect ROI(10, 20, 300, 400);
	Mat img = image(ROI);
	imwrite("result/ROI.bmp", img);
	int aaa;
	cin >> aaa;
	return 0;
}

在这段程序中,原图是image,裁剪区域是以坐标(300,500)为左上角,宽为300,高为400的一个矩形区域,如下图:
原图:1.bmp


裁剪结果如下:RIO.bmp


那么现在就存在一个问题,对于大多数的图像处理项目来说,每幅图像的ROI并不一定是在固定的区域,甚至ROI区域的大小也可能是不一样的,

也就是说在具体裁剪的时候裁剪的位置及矩形区域都是要根据每幅图像来具体确定的,这里将举一个例子进行说明:如下图是一幅啤酒盖的图像,

在后续的检测或者分类中我们只关心啤酒盖所在的区域,也就是说我们ROI区域是包含且仅包含整个啤酒盖的一个矩形区域,如何提取呢?


我的做法,首先对原图进行二值化,然后提取整个图像区域内最大的连通区域,如下图:


在得到这个最大的连通区域,其实也就是啤酒盖所在的区域,我是通过遍历整个图像,找到0度,90度,180度及270度,

四个方向上连通域最靠近图像边缘的点,然后通过这四个点就能用一个矩形框将整个连通区域框出来,代码如下,

采用的是几种遍历方法中最高效的方法:

int up = image.rows, left = image.cols, right = 0, down = 0;
	int flag = 0;
	int nr = image.rows, nc = image.cols;
	if (image.isContinuous())
	{
		nr = 1;
		nc = nc*image.rows;//convert 2D to 1D if the image is continuous
		flag = 1;
	}
	//cout << "flag=" << flag << endl;
	if (flag == 1)//situation 1:the image is continuous
	{
		for (int i = 0; i < nr; i++)
		{
			const uchar* inData = region.ptr<uchar>(i);
			for (int j = 0; j < nc; j++)
			{
				if (*inData == 0 && *(inData + 1) == 255)
				{
					int row = (j + 1) / (region.cols);
					int col = (j + 1) - row*region.cols;
					if (row < up)
					{
						up = row;
					}
					if (col < left)
					{
						left = col;
					}
				}
				if (*inData == 255 && *(inData + 1) == 0)
				{
					int row = j / (region.cols);
					int col = j - row*region.cols;
					if (row > down)
					{
						down = row;
					}
					if (col > right)
					{
						right = col;
					}
				}
				inData++;
			}
		}
	}
	else//situation 2:the image is not continuous
	{
		for (int i = 0; i < nr; i++)
		{
			const uchar* inData = region.ptr<uchar>(i);
			for (int j = 0; j < nc; j++)
			{
				if (*inData == 0 && *(inData + 1) == 255)
				{
					int row = i;
					int col = j;
					if (row < up)
					{
						up = row;
					}
					if (col < left)
					{
						left = col;
					}
				}
				if (*inData == 255 && *(inData + 1) == 0)
				{
					int row = i;
					int col = j;
					if (row > down)
					{
						down = row;
					}
					if (col > right)
					{
						right = col;
					}
				}
				inData++;
			}
		}
	}
	bb[0] = Point2i(left, up);
	bb[1] = Point2i(right, down);
}
其中bb[0],bb[1]是两个坐标点,分别是确定要裁剪的矩形框的左上角与右下角在原图中的坐标,
根据这两个坐标点,可以利用Rect数据类型对原图进行裁剪,如下:
Rect roi(bb[0].x,bb[0].y,bb[1].x-bb[0].x,bb[1].y-bb[0].y)
最终的裁剪结果如下:



显然通过以上办法,实现了对于感兴趣区域的裁剪。

2019-07-23 22:46:58 guanlily123 阅读数 2163

对于图像感兴趣区域(ROI)的提取,一般从来两个方面着手解决:一是利用图像分割技术提取ROI;二是从人眼得视觉特征出发,通过模拟人眼得视觉特点,寻找特定得视觉敏感区域,并将这些视觉敏感区域排序作为ROI。
本文介绍差影法(对图像进行代数运算得一种不同的叫法)、交互式提取法、自动图像分割提取法。
差影法:本文主要用到图像减法,在进行图像处理时,对混合背景和前景的图像,人们往往对前景比较感兴趣,假设背景图像为b(x,y),前景背景混合图像为f(x,y),则去除了背景得图像为:a(x,y)=f(x,y)-b(x,y)
通过差影法提取图像感兴趣区域的实现过程如下:
(1)使用strel函数创建指定形状对应得结构元素,形状参数选择disk,根据背景复杂程度选择合适得圆盘半径。 background=imopen(I,strel(‘disk’,15));
(2)对原始图像和由strel函数创建得结构元素进行开运算,得到背景图像。
(3)使用imsubtract函数对原始图像和背景图像做减法运算,得到消除背景后得感兴趣区域。 I2=imsubtract(I,background);
注:实验图片得背景复杂度不同,圆盘半径参数选取不同。
优点:提取ROI对于背景简单得图像处理效果较好,处理速度快。
缺点:对于复杂背景得图像处理效果不太好,背景干扰不易去除,且不停的实验选取适合得圆盘半径,操作比较麻烦,不太适用于大量图片得感兴趣区域的提取。
发现使用这个方法得一个很好得例子:https://www.jb51.net/softjc/505297.html

交互式提取法:以用户为中心,实现用户与提取算法得交互,能得到比较好的提取效果。
通过交互式提取法提取ROI得实现过程如下:
(1)提取原图得R、G、B分量;
(2)使用ginput函数获得所选择点得坐标;
(3)使用line函数在两个相邻选择点连线,直到终点与起点重合,连成封闭区域;
(4)使用roipoly函数选择封闭折线围成得灰度图得多边形区域,背景部分为黑,区域内为白;
(5)将原图得RGB分量分别与roipoly所得到得多边形区域图像做点乘运算,并联结各分量归一化,得到去除背景保留感兴趣区域得图像。
优点:以用户为中心,让用户自己定义图像得感兴趣区域,不管边界复杂或简单,都可以人为精确选择感兴趣边缘,从而很好得提取出用户感兴趣得区域图像,即精度高。
缺点:依赖于用户得自定义操作,处理速度不高,交互式过程复杂,不易做到友好、自然、不适应大量图片得感兴趣区域提取。
很好得一个例子:https://www.ilovematlab.cn/thread-56748-1-1.html

自动图像分割提取法见下一篇博客。

2019-09-13 12:45:06 Vichael_Chan 阅读数 681

一、特征提取概念

特征提取是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征。特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者连续的区域。

二、特征概述

至今为止特征没有万能和精确的定义。特征的精确定义往往由问题或者应用类型决定。特征是一个数字图像中“有趣”的部分,它是许多计算机图像分析算法的起点。因此一个算法是否成功往往由它使用和定义的特征决定。因此特征提取最重要的一个特性是“可重复性”:同一场景的不同图像所提取的特征应该是相同的。 

特征提取检查每个像素来确定该像素是否代表一个特征。假如它是一个更大的算法的一部分,那么这个算法一般只检查图像的特征区域。作为特征提取的一个前提运算,输入图像一般先在尺度空间中被平滑,此后通过局部导数运算来计算图像的一个或多个特征。
有时,假如特征提取需要许多的计算时间,而可以使用的时间有限制,一个高层次算法可以用来控制特征提取阶层,这样仅图像的部分被用来寻找特征。
由于许多计算机图像算法使用特征提取作为其初级计算步骤,因此有大量特征提取算法被发展,其提取的特征各种各样,它们的计算复杂性和可重复性也非常不同。
下面是用来描述图像的一些基本概念:

1.边缘

边缘是组成两个图像区域之间边界(或边缘)的像素。一般一个边缘的形状可以是任意的,还可能包括交叉点。在实践中边缘一般被定义为图像中拥有大的梯度的点组成的子集。一些常用的算法还会把梯度高的点联系起来来构成一个更完善的边缘的描写。这些算法也可能对边缘提出一些限制。局部地看边缘是一维结构。

2.角

角是图像中点似的特征,在局部它有两维结构。早期的算法首先进行边缘检测,然后分析边缘的走向来寻找边缘突然转向(角)。后来发展的算法不再需要边缘检测这个步骤,而是可以直接在图像梯度中寻找高度曲率。后来发现这样有时可以在图像中本来没有角的地方发现具有同角一样的特征的区域。

3.区域

与角不同的是区域描写一个图像中的一个区域性的结构,但是区域也可能仅由一个像素组成,因此许多区域检测也可以用来监测角。一个区域监测器检测图像中一个对于角监测器来说太平滑的区域。区域检测可以被想象为把一张图像缩小,然后在缩小的图像上进行角检测。

4.脊

长条形的物体被称为脊。在实践中脊可以被看作是代表对称轴的一维曲线,此外局部针对于每个脊像素有一个脊宽度。从灰梯度图像中提取脊要比提取边缘、角和区域困难。在空中摄影中往往使用脊检测来分辨道路,在医学图像中它被用来分辨血管。
特征被检测后它可以从图像中被抽取出来。这个过程可能需要许多图像处理的计算机。其结果被称为特征描述或者特征向量。

三、常用图像特征概述

常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。

1.颜色特征

1.1基本概念
颜色特征是一种全局特征,描述了图像或图像区域所对应的景物的表面性质。一般颜色特征是基于像素点的特征,此时所有属于图像或图像区域的像素都有各自的贡献。由于颜色对图像或图像区域的方向、大小等变化不敏感,所以颜色特征不能很好地捕捉图像中对象的局部特征。另外,仅使用颜色特征查询时,如果数据库很大,常会将许多不需要的图像也检索出来。颜色直方图是最常用的表达颜色特征的方法,其优点是不受图像旋转和平移变化的影响,进一步借助归一化还可不受图像尺度变化的影响,基缺点是没有表达出颜色空间分布的信息。
1.2常用的特征提取与匹配方法
(1) 颜色直方图
其优点在于:它能简单描述一幅图像中颜色的全局分布,即不同色彩在整幅图像中所占的比例,特别适用于描述那些难以自动分割的图像和不需要考虑物体空间位置的图像。其缺点在于:它无法描述图像中颜色的局部分布及每种色彩所处的空间位置,即无法描述图像中的某一具体的对象或物体。
最常用的颜色空间:RGB颜色空间、HSV颜色空间。
颜色直方图特征匹配方法:直方图相交法、距离法、中心距法、参考颜色表法、累加颜色直方图法。
(2) 颜色集
颜色直方图法是一种全局颜色特征提取与匹配方法,无法区分局部颜色信息。颜色集是对颜色直方图的一种近似首先将图像从 RGB颜色空间转化成视觉均衡的颜色空间(如 HSV 空间),并将颜色空间量化成若干个柄。然后,用色彩自动分割技术将图像分为若干区域,每个区域用量化颜色空间的某个颜色分量来索引,从而将图像表达为一个二进制的颜色索引集。在图像匹配中,比较不同图像颜色集之间的距离和色彩区域的空间关系
(3) 颜色矩
这种方法的数学基础在于:图像中任何的颜色分布均可以用它的矩来表示。此外,由于颜色分布信息主要集中在低阶矩中,因此,仅采用颜色的一阶矩(mean)、二阶矩(variance)和三阶矩(skewness)就足以表达图像的颜色分布。
(4) 颜色聚合向量
其核心思想是:将属于直方图每一个柄的像素分成两部分,如果该柄内的某些像素所占据的连续区域的面积大于给定的阈值,则该区域内的像素作为聚合像素,否则作为非聚合像素。

2.纹理特征

2.1基本概念
纹理特征也是一种全局特征,它也描述了图像或图像区域所对应景物的表面性质。但由于纹理只是一种物体表面的特性,并不能完全反映出物体的本质属性,所以仅仅利用纹理特征是无法获得高层次图像内容的。与颜色特征不同,纹理特征不是基于像素点的特征,它需要在包含多个像素点的区域中进行统计计算。在模式匹配中,这种区域性的特征具有较大的优越性,不会由于局部的偏差而无法匹配成功。作为一种统计特征,纹理特征常具有旋转不变性,并且对于噪声有较强的抵抗能力。但是,纹理特征也有其缺点,一个很明显的缺点是当图像的分辨率变化的时候,所计算出来的纹理可能会有较大偏差。另外,由于有可能受到光照、反射情况的影响,从2-D图像中反映出来的纹理不一定是3-D物体表面真实的纹理。例如,水中的倒影,光滑的金属面互相反射造成的影响等都会导致纹理的变化。由于这些不是物体本身的特性,因而将纹理信息应用于检索时,有时这些虚假的纹理会对检索造成“误导”。 在检索具有粗细、疏密等方面较大差别的纹理图像时,利用纹理特征是一种有效的方法。但当纹理之间的粗细、疏密等易于分辨的信息之间相差不大的时候,通常的纹理特征很难准确地反映出人的视觉感觉不同的纹理之间的差别。

2.2常用的特征提取与匹配方法
(1)统计方法
统计方法的典型代表是一种称为灰度共生矩阵的纹理特征分析方法。灰度共生矩阵的四个关键特征是能量、惯量、熵和相关性。统计方法中另一种典型方法是从图像的自相关函数(即图像的能量谱函数)提取纹理特征,即通过对图像的能量谱函数的计算,提取纹理的粗细度及方向性等特征参数
(2)几何法
所谓几何法,是建立在纹理基元(基本的纹理元素)理论基础上的一种纹理特征分析方法。纹理基元理论认为,复杂的纹理可以由若干简单的纹理基元以一定的有规律的形式重复排列构成。在几何法中,比较有影响的算法有两种:Voronio 棋盘格特征法和结构法。
(3)模型法
模型法以图像的构造模型为基础,采用模型的参数作为纹理特征。典型的方法是随机场模型法,如马尔可夫(Markov)随机场(MRF)模型法和 Gibbs 随机场模型法
纹理特征的提取与匹配主要有:灰度共生矩阵、Tamura 纹理特征、自回归纹理模型、小波变换等。
灰度共生矩阵特征提取与匹配主要依赖于能量、惯量、熵和相关性四个参数。Tamura 纹理特征基于人类对纹理的视觉感知心理学研究,提出6种属性,即:粗糙度、对比度、方向度、线像度、规整度和粗略度。自回归纹理模型(simultaneous auto-regressive, SAR)是马尔可夫随机场(MRF)模型的一种应用实例。

3.形状特征

3.1基本概念
各种基于形状特征的检索方法都可以比较有效地利用图像中感兴趣的目标来进行检索,但它们也有一些共同的问题,包括:①目前基于形状的检索方法还缺乏比较完善的数学模型;②如果目标有变形时检索结果往往不太可靠;③许多形状特征仅描述了目标局部的性质,要全面描述目标常对计算时间和存储量有较高的要求;④许多形状特征所反映的目标形状信息与人的直观感觉不完全一致,或者说,特征空间的相似性与人视觉系统感受到的相似性有差别。另外,从 2-D 图像中表现的 3-D 物体实际上只是物体在空间某一平面的投影,从 2-D 图像中反映出来的形状常不是 3-D 物体真实的形状,由于视点的变化,可能会产生各种失真。
3.2常用的特征提取与匹配方法
通常情况下,形状特征有两类表示方法,一类是轮廓特征,另一类是区域特征。图像的轮廓特征主要针对物体的外边界,而图像的区域特征则关系到整个形状区域。
(1)边界特征法
该方法通过对边界特征的描述来获取图像的形状参数。其中Hough 变换检测平行直线方法和边界方向直方图方法是经典方法。Hough 变换是利用图像全局特性而将边缘像素连接起来组成区域封闭边界的一种方法,其基本思想是点—线的对偶性;边界方向直方图法首先微分图像求得图像边缘,然后,做出关于边缘大小和方向的直方图,通常的方法是构造图像灰度梯度方向矩阵。
(2)傅里叶形状描述符法
傅里叶形状描述符(Fourier shape deors)基本思想是用物体边界的傅里叶变换作为形状描述,利用区域边界的封闭性和周期性,将二维问题转化为一维问题。由边界点导出三种形状表达,分别是曲率函数、质心距离、复坐标函数。
(3)几何参数法
形状的表达和匹配采用更为简单的区域特征描述方法,例如采用有关形状定量测度(如矩、面积、周长等)的形状参数法(shape factor)。在 QBIC 系统中,便是利用圆度、偏心率、主轴方向和代数不变矩等几何参数,进行基于形状特征的图像检索。需要说明的是,形状参数的提取,必须以图像处理及图像分割为前提,参数的准确性必然受到分割效果的影响,对分割效果很差的图像,形状参数甚至无法提取。
(4)形状不变矩法
利用目标所占区域的矩作为形状描述参数。

4.空间关系特征

4.1基本概念
所谓空间关系,是指图像中分割出来的多个目标之间的相互的空间位置或相对方向关系,这些关系也可分为连接/邻接关系、交叠/重叠关系和包含/包容关系等。通常空间位置信息可以分为两类:相对空间位置信息和绝对空间位置信息。前一种关系强调的是目标之间的相对情况,如上下左右关系等,后一种关系强调的是目标之间的距离大小以及方位。显而易见,由绝对空间位置可推出相对空间位置,但表达相对空间位置信息常比较简单。
空间关系特征的使用可加强对图像内容的描述区分能力,但空间关系特征常对图像或目标的旋转、反转、尺度变化等比较敏感。另外,实际应用中,仅仅利用空间信息往往是不够的,不能有效准确地表达场景信息。为了检索,除使用空间关系特征外,还需要其它特征来配合。
4.2常用的特征提取与匹配方法
提取图像空间关系特征可以有两种方法:一种方法是首先对图像进行自动分割,划分出图像中所包含的对象或颜色区域,然后根据这些区域提取图像特征,并建立索引;另一种方法则简单地将图像均匀地划分为若干规则子块,然后对每个图像子块提取特征,并建立索引。

2017-01-03 16:38:12 whuhan2013 阅读数 88268

从本节开始, 我们将逐步从数字图像处理向图像识别过渡。 严格地说, 图像特征提取属于图像分析的范畴, 是数字图像处理的高级阶段, 同时也是图像识别的开始。

本文主要包括以下内容

  • 常用的基本统计特征, 如周长、面积、均值等区域描绘子, 以及直方图和灰度共现矩阵等纹理描绘子
  • 主成份分析(PCA, PrincipaJ Component Analysis)
  • 局部二进制模式(LBP, LocaJ Binary Pattern)
  • 本章的典型案例分析
    • 基于PCA技术的人脸数据集的降维处理

图像特征概述

众所周知,计算机不认识图像,只认识数字。为了使计算机能够“理解”图像,从而具有真正意义上的“视觉”,本章我们将研究如何从图像中提取有用的数据或信息,得到图像的“非图像” 的表示或描述,如数值、向量和符号等。这一过程就是特征提取,而提取出来的这些“非图像”的表示或描述就是特征。有了这些数值或向量形式的特征我们就可以通过训练过程教会计算机如何懂得这些特征, 从而使计算机具有识别图像的本领。

什么是图像特征
特征是某一类对象区别于其他类对象的相应(本质)特点或特性, 或是这些特点和特性的集合。特征是通过测量或处理能够抽取的数据。对于图像而言, 每一幅图像都具有能够区别于其他类图像的自身特征,有些是可以直观地感受到的自然特征,如亮度、边缘、纹理和色彩等;有些则是需要通过变换或处理才能得到的, 如矩、直方图以及主成份等。

特征向量及其几何解释
我们常常将某一类对象的多个或多种特性组合在一起, 形成一个特征向量来代表该类对象,如果只有单个数值特征,则特征向量为一个一维向量,如果是n个特性
的组合,则为一个n维特征向量。该类特征向量常常作为识别系统的输入。实际上,一个n维特征就是位于n维空间中的点,而识别分类的任务就是找到对这个n维空
间的一种划分。
例如要区分3种不同的鸾尾属植物,可以选择其花瓣长度和花瓣宽度作为特征,这样就以1个2维特征代表1个植物对象,比如(5.1,3.5).如果再加上萼片长度和萼片宽度, 则每个鸾尾属植物对象由一个4维特征向置表示, 如(5.1, 3.5.1.4, 0.2)。

特征提取的一般原则
图像识别实际上是一个分类的过程,为了识别出某图像所属的类别,我们需要将它与其他不同类别的图像区分开来。这就要求选取的特征不仅要能够很好地描述图像, 更重要的是还要能够很好地区分不同类别的图像。
我们希望选择那些在同类图像之间差异较小(较小的类内距),在不同类别的图像之间差异较大(较大的类间距)的图像特征, 我们称之为最具有区分能力(most discriminative)的特征。此外, 在特征提取中先验知识扮演着重要的角色, 如何依靠先验知识来帮助我们选择特征也是后面将持续关注的问题。

特征的评价标准
一般来说,特征提取应具体问题具体分析,其评价标准具有一定的主观性。然而,还是有一些可供遵循的普遍原则,能够作为我们在特征提取实践中的指导。总结如下。

  • 特征应当容易提取. 换言之, 为了得到这些特征我们付出的代价不能太大. 当然, 这还要与特征的分类能力权衡考虑.
  • 选取的特征应对噪声和不相关转换不敏感. 比如要识别车牌号码, 车牌照片可能是从各个角度拍摄的, 而我们关心的是车牌上字母和数字的内容, 因此就需要得到对几何失真变形等转换不敏感的描绘子, 从而得到旋转不变, 或是投影失真不变的特征.
  • 最重要的一点, 总是应试图寻找最具区分能力的特征.

基本统计特征

本节将主要介绍一些常用的基本统计特征, 包括一些简单的区域描绘子, 直方图及其统计特征, 以及灰度共现矩阵等.

简单的区域描绘子及其Matlab实现

在经过图像分割得到各种我们感兴趣的区域之后,可以利用下面介绍的一些简单区域描绘子作为代表该区域的特征。通常将这些区域特征组合成特征向量以供分类使用。

常用的简单区域描绘子如下。

  • 周长:区域边界的长度, 即位于区域边界上的像素数目.
  • 面积:, 区域中的像素总数.
  • 致密性:(周长) 2/面积.
  • 区域的质心.
  • 灰度均值: 区域中所有像素的平均值.
  • 灰度中值: 区域中所有像素的排序中值.
  • 包含区域的最小矩形.
  • 最小或最大灰度级.
  • 大于或小于均值的像素数.
  • 欧拉数: 区域中的对象数减去这些对象的孔洞数。

在Matlab中, 函数regionprops用于计算区域描绘子的有利工具, 其原型为:
D = regionprops(L,properties)
L是一个标记矩阵, 可通过8.3.4小节介绍的连通区标注函数bwlabel得到.
properties可以是一个用逗号分割的字符串列表, 其一些常用取值如表10.1所示

利用regionprops函数提取简单的区域特征

I = imread('bw_mouth.bmp');
I1 = bwlabel(I);
D = regionprops(I1,'area','centroid');
D.Area

直方图及其统计特征

首先来看纹理的概念。纹理是图像固有的特征之一,是灰度(对彩色图像而言是颜色)在空间以一定的形式变换而产生的图案(模式),有时具有一定的周期性。既然纹理区域的像素灰度级分布具有一定的形式,而直方图正是描述图像中像素灰度级分布的有力工具, 因此用直方图来描述纹理就顺理成章了。

毫无疑问,相似的纹理具有相似的直方图;而由图10.2可见,3种不同特点的纹理对应3种不同的直方图。这说明直方图与纹理之间存在着一定的对应关系。因此,我们可以用直 方图或其统计特征作为图像纹理特征。直方图本身就是一个向量,向量的维数是直方图统计 的灰度级数,因此我们可以直接以此向量作为代表图像纹理的样本特征向量,从而交给分类器处理,对于LBP直方图就常常这样处理(见10.5节);另一种思路是进一步从直方图中提取出能够很好地描述直方图的统计特征,将直方图的这些统计特征组合成为样本特征向量, 这样做可以大大降低特征向量的维数。

直方图的常用统计特征如下所述。


一个由均值、标准差、平滑度和熵组合而成的特征向量如:v = (m,a, R, e)。
应认识到直方图及其统计特征是一种区分能力相对较弱的特征,这主要因为直方图属于一阶统计特征,而它们的一阶统计特征是无法反映纹理结构的变化的。直方图与纹理的对应关系并不是一对一的:首先,不同的纹理可能具有相同或相似的直方图,如图10.3所示的两种截然不同的图案就具有完全相同的直方图;其次,即便是两个不同的直方m.也可能具有相同的统计特 征如均值、标准差等。因此,依靠直方图及其统计特征来作为分类特征时需要特别注意。

灰度共现矩阵

我们说灰度直方图是一种描述单个像素灰度分布的一阶统计量;而灰度共现矩阵描述的则是具有某种空间位置关系的两个像素的联合分布,可以看成是两个像素灰度对的联合直方图,是种二阶统计量。



由于灰度共现矩阵总共含有LXL个元素,当灰度级L比较大时它将是一个庞大的方阵。如对于一般的256灰度图,凡就是一个256X256的矩阵,共216 个元素。如此庞大的矩阵将使后续的计算量剧增。因此普通灰度图像通常要经过处理以减少灰度级数,而后再计算灰度共现矩阵。可以通过分析纹理图像的直方图,在尽量不影响纹理质量的情况下.通过适当的灰度变换来达到灰度级压缩的目的。

特征降维

维度灾难

最大值时,分类器的性能不是得到改善,而是退化。这种现象正是在模式识别中被称为“维度灾难”的一种表现形式。例如,我们要区分西瓜和冬瓜,表皮的纹理和长宽比例都是很好 的特征,还可以再加上瓜籽的颜色以辅助判断,然而继续加入重量、体积等特征可能是无益 的,甚至还会对分类造成干扰。
基于以上所述原因,降维对我们产生了巨大的吸引力。在低维空间中计算和分类都将变 得简单很多,训练(教授分类器如何区分不同类样本的过程,详见第11章)所需的样本数目也会大大降低。通过选择好的特征,摒弃坏的特征(10.3.2特征选择),将有助于分类器性能的提升;在通过组合特征降维时,在绝大多数情况下,丢弃某些特征所损失的信息通过在低 维空间中更加精确的映射(10.3.3特征抽取)可以得到补偿。

具体来说,降低维度又存在着两种方法:特征选择和特征抽取。如图10.8所示,特征选择是指选择全部特征的一个子集作为特征向量:特征抽取是指通过已有特征的组合建立一个 新的特征子集,10.3.2小节将要介绍的主成份分析方法(principa1component analysis, PCA)就是通过原特征的线性组合建立新的特征子集的一种特征抽取方法。

特征选择简介

重新回到10.1.3小节那个鸾尾属植物的问题。对于每一个莺尾属植物样本,总共有4个属性可以使用一一花瓣长度、花瓣宽度、萼片长度和萼片宽度。我们的目的是从中选择两个属性组成特征向量用于分类这3种鸾尾属植物。下面的Matlab程序选择了不同的特征子集,并给出了在对应特征空间中样本分布的可视化表示。

load fisheriris;
data = [meas(:,1),meas(:,2)];
figure;
scatter(data(1:50,1),data(1:50,2),'b+');
hold on,scatter(data(51:100,1),data(51:100,2),'r*');
hold on,scatter(data(101:150,1),data(101:150,2),'go');

data = [meas(:,1),meas(:,3)];
figure;
scatter(data(1:50,1),data(1:50,2),'b+');
hold on,scatter(data(51:100,1),data(51:100,2),'r*');
hold on,scatter(data(101:150,1),data(101:150,2),'go');

主成分分析(Princjpal Component Analysis, PCA)

特征抽取是指通过已有特征的组合(变换)建立一个新的特征子集。在众多的组合方法当中,线性组合(变换)因其计算简单且便于解析分析的特点而显得颇具吸引力。下面就介绍一种通过特征的线性组合来实现降维的方法——主成分分析(principal conponent analysis.PCA)。PCA的实质就是在尽可能好地代表原始数据的前提下, 通过线性变换将高维空间中的样本数据投影到低维空间中

具体可参见:降维算法学习
为得到最小平方误差,应选取散布矩阵s的最大本征值所对应的本征向量作为投影直线e的方向。
也就是说, 通过将全部n个样本向 以散布矩阵最大本征值对应的本征向量为方向的直线投影, 可以得到最小平方误差意义下这 n个样本的一维表示。

PCA计算实例

数据表示与数据分类
通过PCA降维后的数据并不一定最有利于分类,因为PCA的目的是在低维空间中尽可能好地表示原数据,确切地说是在最小均方差意义下最能代表原始数据。而这一目的有时会和数据分类的初衷相违背。图10.13说明了这种情况,PCA投影后数据样本得到了最小均方意义 下的最好保留 , 但在降维后的一维空间中两类样本变得非常难以区分。图中还给出了一种适合于分类的投影方案,对应着另一种常用的降维方法-线性判别分析(linear discriminant analysis. LDA)。PCA寻找的是能够有效表示数据的主轴方向,而LDA则是寻找用来有效分类的投影方向。

PCA的Matlab实现
函数princomp实现了对PCA的封装, 其常见调用形式为:
[COEFF,SCORE,latent]= princomp(X);
X为原始样本组成n*d的矩阵,其每一行是一个样本特征向量,每一列表示样本特征向量的一维.如对于例10.2中的问题,X就是一个8*2的样本矩阵, 总共8个样本, 每个样本2维.
COEFF: 主成份分量, 即变换空间中的那些基向量, 也是样本协方差矩阵的本征向量.
SCORE: 主成份,X的低维表示, 即X中的数据在主成分分量上的投影(可根据需要取前面几列的).
latent: 一个包含着样本协方差矩阵本征值的向量.

快速PCA及其实现
PCA的计算中最主要的工作量是计算样本协方差矩阵的本征值和本征向量。设样本矩阵 X大小为n*d (n个d维样本特征向量), 则样本散布矩阵(协方差矩阵) S将是一个dXd的方阵,故当维数d较大时计算复杂度会非常高。例如当维数d=1OOOO,S是一个10000*10000的矩阵,此时如果采用上面的princomp函数计算主成分,Matlab通常会出现内存耗尽的错误,即使有足够多的内存, 要得到S的全部本征值可能也要花费数小时的时间

Matlab实现
我们编写了fastPCA函数用来对样本矩阵A进行快速主成份分析和降维(降至k维),其输出pcaA为降维后的K维样本特征向量组成的矩阵, 每行一个样本, 列数K为降维后的样本特征维数,相当千princomp函数中的输出SCORE, 而输出V为主成份分量,好princomp函数中的COEFF

function [pcaA V] = fastPCA( A, k )
% 快速PCA
%
% 输入:A --- 样本矩阵,每行为一个样本
%      k --- 降维至 k 维
%
% 输出:pcaA --- 降维后的 k 维样本特征向量组成的矩阵,每行一个样本,列数 k 为降维后的样本特征维数
%      V --- 主成分向量

[r c] = size(A);

% 样本均值
meanVec = mean(A);

% 计算协方差矩阵的转置 covMatT
Z = (A-repmat(meanVec, r, 1));
covMatT = Z * Z';

% 计算 covMatT 的前 k 个本征值和本征向量
[V D] = eigs(covMatT, k);

% 得到协方差矩阵 (covMatT)' 的本征向量
V = Z' * V;

% 本征向量归一化为单位本征向量
for i=1:k
    V(:,i)=V(:,i)/norm(V(:,i));
end

% 线性变换(投影)降维至 k 维
pcaA = Z * V;

% 保存变换矩阵 V 和变换原点 meanVec
save('Mat/PCA.mat', 'V', 'meanVec');


在得到包含R的特征向量的矩阵V之后,为计算散布矩阵S的本征向量,只需计算Z*V。此外,还应注意PCA中需要的是具有单位长度的本征向量, 故最后要除以该向量的模从而将正交本征向量归一化为单位正交本征向量。

局部二进制模式

局部二进制模式(local binary patterns, LBP)最早是作为一种有效的纹理描述算子提出的,由于其对图像局部纹理特征的卓越描绘能力而获得了广泛的应用。LBP特征具有很强的
分类能力(highly discriminative)、较高的计算效率, 并且对于单调的灰度变化具有不变性。

基本LBP


LBP的主要思想是以某一点与其邻域像素的相对灰度作为响应, 正是这种相对机制使 LBP算子对于单调的灰度变化具有不变性。 人脸图像常常会受到光照因素的影响而产生灰度变化,但在一个局部区域内,这种变化常常可以被视为是单调的,因此LBP在光照不均的人 脸识别应用中也取得了很好的效果.

圆形邻域的LBPP,R算子

基本LBP算子可以被进一步推广为使用不同大小和形状的邻域。采用圆形的邻域并结合双线性插值运算使我们能够获得任意半径和任意数目的邻域像素点。图10.18给出了一个半径为2的8邻域像素的圆形邻域, 图中每个方格对应一个像素,对于正好处于方格中心的邻
域点(左、上、右、下四个黑点),直接以该点所在方格的像素值作为它的值;对于不在像素中心位置的邻域点(斜45度方向的4个黑点), 通过双线性插值确定其值。

统一化LBP算子一一UnifomLBP

由于LBP直方图大多都是针对图像中的各个分区分别计算的(详见10.5.5),对于一个普通大小的分块区域,标准LBP算子得到的二进模式数目(LBP直方图收集箱数目)较多,而实际位于该分块区域中的像素数目却相对较少, 这将会得到一个过于稀疏的直方图。从而
使直方图失去统计意义。 因此应设法减少一些冗余的LBP模式, 同时又保留足够的具有重要描绘能力的模式。

MB-LBP


图像分区

曾提到, 作为图像的一阶统计特征,直方图无法描述图像的结构信息。而图像各个区域的局部特征往往差异较大,如果仅对整个团像的生成一个LBP直方图,这些局部的差异信息就会丢失。分区LBP特征可有效解决这一问题。
具体的方法是将一幅图像适当地划分为PXQ个分区(partition),然后分别计算每个图像分区的直方图特征,最后再将所有块的直方图特征连接成一个复合的特征向量(composite
feature)作为代表整个图像的LBP直方图特征。

分区大小的选择
理论上, 越小越精细的分区意味着更好的局部描述能力,但同时会产生更高维数的复合特征。然而过小的分区会造成宜方图过于稀疏从而失去统计意义。人脸识别的应用中选择了18X21的分区大小,这可以作为对于一般问题的指导性标准,因为它是一个精确描述能力与特征复杂度的良好折中。在表情识别中更小一些(如1OX15)的分区被我们证明能够获得更好的分类能力。这里分区大小的单位是.MB-LBP的像素块(block)。如对于传统LBP, 每个
分区大小取18像素X21像素, 则对于应MB-LBP分区大小应取18像素块X21像素块= 54像素X63像素口


图像的特征提取

阅读数 6899

没有更多推荐了,返回首页