实现: 1、掌握图像的基本特征算法,理解图像中目标的几何特征、形状特征的物理与几何意义,并能够将特征的数学语言转换成程序描述。 2、掌握图像的角点特征算法,理解Moravec角点的物理与几何意义,并能够将角点的数学语言转换成程序描述。 3、掌握图像的纹理分析算法,理解对比度、熵、角二阶矩等纹理测度的几何意义,并能够将纹理特征描述的数学语言转换成程序描述。
1、掌握图像的基本特征算法,理解图像中目标的几何特征、形状特征的物理与几何意义。 图像的基本特征提取对研究工作有着重要的帮助,而图像的几何特征和形状特征更是尤为重要。本次实验我先将图像进行滤波处理,使用的是中值滤波。然后使用canny算子进行图像边界轮廓的提取,由于opencv有大量的接口函数可供我们使用,故我调用了许多接口函数直接画出最小外接矩和外接圆,并使用接口函数计算图像的面积、周长等,最后通过简单的数学公式运算得出外接圆半径、外接圆心坐标、矩形度延长度、周长比、似圆度、形状复杂性、一阶矩、二阶矩等图像几何特征。主要实现代码如下所示:
int features()
{
stroage = cvCreateMemStorage();
Mat src = imread("..//feature1.png");
Mat I;
imshow("原图", src);
medianBlur(src, I, 3); //中值滤波
cvtColor(I, I, CV_BGR2GRAY); //函数是一个颜色空间转换函数, 可以实现RGB颜色向HSV, HSI等颜色空间转换
Mat contours;
Canny(I, contours, 100, 255); //边缘检测算子
threshold(contours, contours, 100, 255, CV_THRESH_TRUNC); //二值化
int numcontours = cvFindContours(&(CvMat)contours, stroage, &seq, sizeof(CvContour), CV_RETR_LIST); //轮廓提取
CvMoments moments; //申请内存
CvHuMoments hu; //hu矩
cvMoments(&(CvMat)I, &moments, 0);
cvGetHuMoments(&moments, &hu);
if (ku != numcontours)
{
ku = numcontours;
printf("contournum:::: %d \n", numcontours);
}
CvSeq *c = 0;
int zz = 0;
int totl = 0;
cvSet(contourimage, cvScalar(255, 0, 255)); //cvscalar是opencv常用的结构体
cvSet(contourimage, cvScalar(125, 0, 125));
CvPoint2D32f center; //二维坐标下的点,类型为浮点
float radius;
CvPoint2D32f rectpoint[4];
CvContour *testcontour = 0; //发展自序列
//c为轮廓顶点数组
for (c = seq; c != NULL; c = c->h_next)
{
// 取得轮廓面积
double testdbArea = fabs(cvContourArea(c, CV_WHOLE_SEQ));
//取得轮廓长度
double testdbLength = cvArcLength(c);
c->block_max;
if (testdbArea >= 50 && testdbLength |