图像处理
下列算法中属于图像锐化处理的是高通滤波 。 图像编码的目的是压缩数据、减少图像存储空间、提高图像传输效率 。(个人理解) 图像边缘检测算子有Sobel算子、Roberts算子、Prewitt算子、Laplacian算子和Canny算子 。 下列算法中,属于点处理的是傅里叶变换 。 a. 二值化 b. 梯度锐化 c.中值滤波 d.傅里叶变换 下列压缩编码方式中,有损压缩是DCT编码 a. 算术编码 b. Huffman编码 c.香农编码 d. DCT编码 采用模板
[ − 1 1 ]
主要检测水平 方向的边缘。
模式识别
模式识别系统的基本构成单元包括: 模式采集、特征提取与选择和模式分类 。 统计模式识别中描述模式的方法一般使用特征矢量 ;句法模式识别中模式描述方法一般有串、 树、 网。 聚类分析算法属于无监督分类 ,判别域代数界面方程法属于统计模式识别方法 。 若描述模式的特征量为0-1二值特征量,则一般采用匹配测度 进行相似性度量。 Fisher线性判别函数的求解过程是将N维特征矢量投影到一维空间 中进行。 下列判别域界面方程法中只适用于线性可分情况的算法有感知器算法 ;线性可分、不可分都适用的有积累位势函数法 。 模式识别的基本方法有数据聚类、神经网络、统计分析 和结构模式识别 。(个人理解) 聚类 属于非监督学习,分类 属于监督学习,回归 属于监督学习。
编程能力
unsigned char* pucImage 指向一副200*100大小的8位灰度图像数据,写一段C语言代码,统计该图像的直方图信息。
int *pucImgHist(unsigned char * pucImage) {
int height = 100 ;
int width = 200 ;
int *pHist = new int [256 ];
memset (pHist, 0 , 256 *sizeof (int ));
unsigned char * pData = NULL;
for (int j=0 ; j<height; j++) {
pData = pucImage + j * width;
for (int i=0 ; i<width; i++) {
pHist[*pData]++;
pData++;
}
}
return pHist;
}
int searchBy2Division(int array [], int n, int v) {
int left, right, middle;
left = 0 , right = n-1 ;
while (left <= right) {
middle = left + (right - left) / 2 ;
if (array [middle] > v){
right = middle - 1 ;
} else if (array [middle] < v) {
left = middle + 1 ;
} else {
return middle;
}
}
return -1 ;
}
Code Snippets
#include <stdio.h>
#include <stdlib.h>
#include <opencv2/core/core_c.h>
#include <opencv2/highgui/highgui_c.h>
#include <opencv2/imgproc/imgproc_c.h>
int main()
{
IplImage *pSrcImg = cvLoadImage("./lena.jpg" , 1 );
if (pSrcImg == NULL)
{
printf ("Fail to load image!\n" );
return -1 ;
}
int height = pSrcImg->height;
int width = pSrcImg->width;
int step = pSrcImg->widthStep;
int channel = pSrcImg->nChannels;
uchar *pSrcData = (uchar *)pSrcImg->imageData;
IplImage *pGrayImg = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1 );
uchar *pGrayData = (uchar *)pGrayImg->imageData;
uchar bgr[3 ];
uchar gray = 0 ;
for (int i=0 ;i<height;i++)
{
for (int j=0 ;j<width;j++)
{
for (int k=0 ;k<channel;k++)
{
bgr[k] = pSrcData[i*step+j*channel+k];
}
gray = (uchar)(0.114 *bgr[0 ] + 0.587 *bgr[1 ] + 0.299 *bgr[2 ]);
pGrayData[i*width+j] = gray;
}
}
int pHist[256 ];
memset (pHist, 0 , sizeof (int )*256 );
pGrayData = (uchar *)pGrayImg->imageData;
for (int i=0 ; i<height; i++) {
for (int j=0 ; j<width; j++) {
gray = pGrayData[i*width + j];
pHist[gray]++;
}
}
IplImage *pEdgeImg = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1 );
uchar *pEdgeData = (uchar *)pEdgeImg->imageData;
pGrayData = (uchar *)pGrayImg->imageData;
int w = 3 , k = 0 ;
uchar grayW[w*w];
int sobelx[9 ] = {-1 , 0 , 1 , -2 , 0 , 2 , -1 , 0 , 1 };
int sobely[9 ] = {-1 , -2 , -1 , 0 , 0 , 0 , 1 , 2 , 1 };
int sx = 0 , sy = 0 ;
for (int i=1 ; i<height-1 ; i++) {
for (int j=1 ; j<width-1 ; j++) {
k = 0 ;
for (int m=-w/2 ; m<=w/2 ; m++) {
int x = i + m;
x = (x >= 0 ? (x < height ? x : height-1 ) : 0 );
for (int n=-w/2 ; n<=w/2 ; n++) {
int y = j + n;
y = ( y >= 0 ? (y < width ? y : width-1 ) : 0 );
grayW[k] = pGrayData[x*width + y];
k += 1 ;
}
}
sx = 0 , sy = 0 ;
for (int ik =0 ; ik < w*w; ik++) {
sx += grayW[ik]*sobelx[ik];
}
for (int ik =0 ; ik < w*w; ik++) {
sy += grayW[ik]*sobely[ik];
}
pEdgeData[i*width+j] = sx/2 + sy/2 ;
}
}
cvNamedWindow( "edge" , 0 );
cvShowImage( "edge" , pEdgeImg);
cvWaitKey(0 );
cvDestroyWindow( "edge" );
return 0 ;
}