【OpenCV】图像特征提取

形状提取

#include <opencv2/opencv.hpp>    
    
using namespace cv;   
  /*
		形状提取
  */
int main()   
{   
	IplImage* pCannyImg = NULL;
	IplImage* pImg = NULL;
   Mat img = imread("../../leaf2.jpg",1);   
 // Mat img = imread("image.jpg");  
Mat grey;  
cvtColor(img, grey, CV_BGR2GRAY);  

Mat sobelx;  
Sobel(grey, sobelx, CV_32F, 1, 0);  

double minVal, maxVal;  
minMaxLoc(sobelx, &minVal, &maxVal); //find minimum and maximum intensities  
Mat draw;  
sobelx.convertTo(draw, CV_8U, 255.0/(maxVal - minVal), -minVal * 255.0/(maxVal - minVal));  

namedWindow("1", CV_WINDOW_AUTOSIZE);  
imshow("1",img); 
imshow("",draw);  

//*pImg = IplImage(draw);

//pCannyImg = cvCreateImage(cvGetSize(&draw), IPL_DEPTH_8U, 1);
//cvCanny(&draw, pCannyImg, 100, 180, 3);
//cvNamedWindow("canny",1);
//cvShowImage( "canny", pCannyImg );
waitKey();  
    
   return 0;   
}   




轮廓提取


#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
/*
	边缘提取
*/

int main( int argc, char** argv )
{
         //声明IplImage指针
         IplImage* pImg = NULL;
         IplImage* pCannyImg = NULL;
         //载入图像,强制转化为Gray
         pImg = cvLoadImage( "../test.jpg",0);
         //为canny边缘图像申请空间
		 //IplImage* cvCreateImage( CvSize size, int depth, int channels );
         pCannyImg = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
         //canny边缘检测
		 //第一个参数image 输入单通道图像(可以是彩色图像)对于多通道的图像可以用cvCvtColor()修改。
		 //第三个参数是控制细节的,越小细节越多,
         cvCanny(pImg, pCannyImg, 50, 150, 3);
         //创建窗口
		 //0表示用户可以手动调节窗口大小,且显示的图像尺寸随之变化。
         cvNamedWindow("src", 1);
         cvNamedWindow("canny",1);
         //显示图像
         cvShowImage( "src", pImg );
         cvShowImage( "canny", pCannyImg );
         //等待按键
         cvWaitKey(0);
         //销毁窗口
         cvDestroyWindow( "src" );
         cvDestroyWindow( "canny" );
         //释放图像
         cvReleaseImage( &pImg );
         cvReleaseImage( &pCannyImg );
         return 0;
}



角特征提取


#include <stdio.h>
#include "cv.h"
#include "highgui.h"
 
#define MAX_CORNERS 100
 
int main(void)
{
int cornersCount=MAX_CORNERS;//得到的角点数目
CvPoint2D32f corners[MAX_CORNERS];//输出角点集合
IplImage *srcImage = 0,*grayImage = 0,*corners1 = 0,*corners2 = 0;
int i;

//typedef struct CvScalar
//{
//  double val[4];
//  }CvScalar;
//
//在Opencv中,cvScalar是CV_RGB的宏,cvScalar的储存顺序是B-G-R,而CV_RGB的储存顺序是R-G-B,两者正好相反
//所以你的cvScalar(255,0,0),实际意思是B=255,当然是蓝色的
CvScalar color = CV_RGB(255,0,0);
cvNamedWindow("image",1);
 
//Load the image to be processed 
srcImage = cvLoadImage("../test.jpg",1);
grayImage = cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_8U,1);
 
//copy the source image to copy image after converting the format
//复制并转为灰度图像
cvCvtColor(srcImage,grayImage,CV_BGR2GRAY);
 
//create empty images os same size as the copied images
//两幅临时位浮点图像,cvGoodFeaturesToTrack会用到
corners1 = cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_32F,1);
corners2 = cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_32F,1);
 
cvGoodFeaturesToTrack(grayImage,corners1,corners2,corners,&cornersCount,0.05,
30,//角点的最小距离是
0,//整个图像
3,0,0.4);
printf("num corners found: %d\n",cornersCount);
 
//开始画出每个点
if (cornersCount>0)
{
for (i=0;i<cornersCount;i++)
{
cvCircle(srcImage,cvPoint((int)(corners[i].x),(int)(corners[i].y)),2,color,2,CV_AA,0);
}
}
cvShowImage("image",srcImage);
cvSaveImage("imagedst.png",srcImage);
 
cvReleaseImage(&srcImage);
cvReleaseImage(&grayImage);
cvReleaseImage(&corners1);
cvReleaseImage(&corners2);
 
cvWaitKey(0);
return 0;
}






纹理提取

#include <iostream>
#include <math.h>
#include "cv.h"
#include "highgui.h"
 
int main(int argc, char* argv[])
{
int tmp[8]={0};
int sum=0;int k=0;
IplImage* img,*dst;
img=cvLoadImage("../test.jpg",0);
CvScalar s;
cvNamedWindow("img",NULL);
cvNamedWindow("dst",NULL);
cvShowImage("img",img);
 
uchar* data=(uchar*)img->imageData;
int step=img->widthStep;
dst=cvCreateImage(cvSize(img->width,img->height),img->depth,0);
dst->widthStep=img->widthStep;
for(int i=1;i<img->height-1;i++)
for(int j=1;j<img->width-1;j++)
{
if(data[(i-1)*step+j-1]>data[i*step+j]) tmp[0]=1;
else tmp[0]=0;
if(data[i*step+(j-1)]>data[i*step+j]) tmp[1]=1;
else tmp[1]=0;
if(data[(i+1)*step+(j-1)]>data[i*step+j]) tmp[2]=1;
else tmp[2]=0;
if (data[(i+1)*step+j]>data[i*step+j]) tmp[3]=1;
else tmp[3]=0;
if (data[(i+1)*step+(j+1)]>data[i*step+j]) tmp[4]=1;
else tmp[4]=0;
if(data[i*step+(j+1)]>data[i*step+j]) tmp[5]=1;
else tmp[5]=0;
if(data[(i-1)*step+(j+1)]>data[i*step+j]) tmp[6]=1;
else tmp[6]=0;
if(data[(i-1)*step+j]>data[i*step+j]) tmp[7]=1;
else tmp[7]=0;
for(k=0;k<=7;k++)
sum+=abs(tmp[k]-tmp[k+1]);
sum=sum+abs(tmp[7]-tmp[0]);
if (sum<=2)
s.val[0]=(tmp[0]*128+tmp[1]*64+tmp[2]*32+tmp[3]*16+tmp[4]*8+tmp[5]*4+tmp[6]*2+tmp[7]);
else s.val[0]=59;
cvSet2D(dst,i,j,s);
}
 
cvShowImage("dst",dst);
cvWaitKey(-1);
 
return 0;
}




改变图片尺寸

通常进行图像识别要对图片进行预处理,同一尺寸很关键。

#include "cv.h"  
#include "highgui.h"  
#include "stdio.h"  
  
int main(int argc,char *argv[])  
{  
 IplImage *image=0,*imageresize=0;  
 image=cvLoadImage("../../test.jpg",1);  
 if(!image) printf("can't load an image/n");  
 imageresize=cvCreateImage(cvSize(64,64),IPL_DEPTH_8U,3);  //cvSize(width,heigth)尺寸改这里
 cvResize(image,imageresize,CV_INTER_LINEAR);  
 cvNamedWindow("lena",1);  
 cvNamedWindow("size",1);  
 cvShowImage("size",imageresize);  
 cvShowImage("lena",image);  
 cvWaitKey(0);  
 cvReleaseImage(&image);  
 cvReleaseImage(&imageresize);  
 cvDestroyWindow("size");  
 cvDestroyWindow("lena");  
 return 0;  
} 


滤波(模糊)

#include "cv.h"
#include "highgui.h"
#include "stdio.h"
int main(){
	IplImage *image=0,*img=0; 
	  IplImage* pCannyImg = NULL;
    image= cvLoadImage("../../test.jpg");//读取图片
	img=cvCreateImage(cvSize(480,480),IPL_DEPTH_8U,3);  
	cvResize(image,img,CV_INTER_LINEAR); 

    cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE);
    cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE);
   cvNamedWindow("Example3",CV_WINDOW_AUTOSIZE);
    cvNamedWindow("Example4",CV_WINDOW_AUTOSIZE);
    cvNamedWindow("Example5",CV_WINDOW_AUTOSIZE);
    cvNamedWindow("Example6",CV_WINDOW_AUTOSIZE);



    cvShowImage("Example1",img);//在Example1显示图片
    //    cvCopy(img,temp);
    IplImage* temp=cvCreateImage( //创建一个size为image,三通道8位的彩色图
        cvGetSize(img),
        IPL_DEPTH_8U,
        3
        );
    cvSmooth(img,temp,CV_BLUR,3,3);//简单模糊
    cvShowImage("Example2",temp);

    cvSmooth(img,temp,CV_BLUR_NO_SCALE,3,3);//简单无缩放变化的模糊
    cvShowImage("Example3",temp);

    cvSmooth(img,temp,CV_MEDIAN,3,3);//中值模糊
    cvShowImage("Example4",temp);

    cvSmooth(img,temp,CV_GAUSSIAN,3,3);//高斯模糊
    cvShowImage("Example5",temp);

    cvSmooth(img,temp,CV_BILATERAL,1,600,500,500);//双边滤波
    cvShowImage("Example6",temp);

	//边缘提取
	//为边缘图像申请空间
	//pCannyImg = cvCreateImage(cvGetSize(temp), IPL_DEPTH_8U, 1);
	//cvCanny(temp, pCannyImg, 50, 150, 3);
	//cvNamedWindow("canny", 1);
	//cvShowImage( "canny", pCannyImg );


    cvWaitKey(0);//暂停用于显示图片


    cvReleaseImage(&img);//释放img所指向的内存空间并且
    cvDestroyWindow("Example1");
    cvDestroyWindow("Example2");
    cvDestroyWindow("Example3");
    cvDestroyWindow("Example4");
    cvDestroyWindow("Example5");
    cvDestroyWindow("Example6");
    
    return 0;
}

就是变模糊,模糊的效果不太一样。不同场合不同需求来选择。中值模糊+边缘提取就要比高斯滤波+边缘提取感觉效果好点。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值