//c.h

typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;
typedef long LONG;

//位图文件头定义;
//其中不包含文件类型信息(由于结构体的内存结构决定,
//要是加了的话将不能正确读取文件信息)
typedef struct tagBITMAPFILEHEADER{
//WORD bfType;//文件类型,必须是0x424D,即字符“BM”
DWORD bfSize;//文件大小
WORD bfReserved1;//保留字
WORD bfReserved2;//保留字
DWORD bfOffBits;//从文件头到实际位图数据的偏移字节数
}BITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER{
DWORD biSize;//信息头大小
LONG biWidth;//图像宽度
LONG biHeight;//图像高度
WORD biPlanes;//位平面数,必须为1
WORD biBitCount;//每像素位数
DWORD biCompression; //压缩类型
DWORD biSizeImage; //压缩图像大小字节数
LONG biXPelsPerMeter; //水平分辨率
LONG biYPelsPerMeter; //垂直分辨率
DWORD biClrUsed; //位图实际用到的色彩数
DWORD biClrImportant; //本位图中重要的色彩数
}BITMAPINFOHEADER; //位图信息头定义

typedef struct tagRGBQUAD{
BYTE rgbBlue; //该颜色的蓝色分量
BYTE rgbGreen; //该颜色的绿色分量
BYTE rgbRed; //该颜色的红色分量
BYTE rgbReserved; //保留值
}RGBQUAD;//调色板定义

//像素信息
typedef struct tagIMAGEDATA
{
BYTE blue;
//BYTE green;
//BYTE red;
}IMAGEDATA;

#include <stdio.h>
#include "c.h"
#include "stdlib.h"
#include "math.h"
#include <iostream>

#define PI 3.14159//圆周率宏定义
#define LENGTH_NAME_BMP 30//bmp图片文件名的最大长度

using namespace std;

//变量定义
BITMAPFILEHEADER strHead;
RGBQUAD strPla[256];//256色调色板
BITMAPINFOHEADER strInfo;

//显示位图文件头信息
void showBmpHead(BITMAPFILEHEADER pBmpHead){
cout<<"位图文件头:"<<endl;
cout<<"文件大小:"<<pBmpHead.bfSize<<endl;
cout<<"保留字_1:"<<pBmpHead.bfReserved1<<endl;
cout<<"保留字_2:"<<pBmpHead.bfReserved2<<endl;
cout<<"实际位图数据的偏移字节数:"<<pBmpHead.bfOffBits<<endl<<endl;
}

void showBmpInforHead(tagBITMAPINFOHEADER pBmpInforHead){
cout<<"位图信息头:"<<endl;
cout<<"结构体的长度:"<<pBmpInforHead.biSize<<endl;
cout<<"位图宽:"<<pBmpInforHead.biWidth<<endl;
cout<<"位图高:"<<pBmpInforHead.biHeight<<endl;
cout<<"biPlanes平面数:"<<pBmpInforHead.biPlanes<<endl;
cout<<"biBitCount采用颜色位数:"<<pBmpInforHead.biBitCount<<endl;
cout<<"压缩方式:"<<pBmpInforHead.biCompression<<endl;
cout<<"biSizeImage实际位图数据占用的字节数:"<<pBmpInforHead.biSizeImage<<endl;
cout<<"X方向分辨率:"<<pBmpInforHead.biXPelsPerMeter<<endl;
cout<<"Y方向分辨率:"<<pBmpInforHead.biYPelsPerMeter<<endl;
cout<<"使用的颜色数:"<<pBmpInforHead.biClrUsed<<endl;
cout<<"重要颜色数:"<<pBmpInforHead.biClrImportant<<endl;
}

//main.cpp
int main(){
char strFile[LENGTH_NAME_BMP];//bmp文件名
IMAGEDATA *imagedata = NULL;//动态分配存储原图片的像素信息的二维数组
IMAGEDATA *imagedataverage = NULL;//动态分配存储旋转后的图片的像素信息的二维数组
IMAGEDATA *imagedatalevel = NULL;
IMAGEDATA *imagedatavertical = NULL;
int width,height;//图片的宽度和高度
cout<<"请输入所要读取的文件名:"<<endl;
cin>>strFile;
FILE *fpi,*fpw;
fpi=fopen(strFile,"rb");
if(fpi != NULL){
//先读取文件类型
WORD bfType;
fread(&bfType,1,sizeof(WORD),fpi);
if(0x4d42!=bfType)
{
cout<<"the file is not a bmp file!"<<endl;
return (1);
}
//读取bmp文件的文件头和信息头
fread(&strHead,1,sizeof(tagBITMAPFILEHEADER),fpi);
//showBmpHead(strHead);//显示文件头
fread(&strInfo,1,sizeof(tagBITMAPINFOHEADER),fpi);
//showBmpInforHead(strInfo);//显示文件信息头

//读取调色板
for(unsigned int nCounti=0;nCounti<strInfo.biClrUsed;nCounti++)
{
fread((char *)&(strPla[nCounti].rgbBlue),1,sizeof(BYTE),fpi);
fread((char *)&(strPla[nCounti].rgbGreen),1,sizeof(BYTE),fpi);
fread((char *)&(strPla[nCounti].rgbRed),1,sizeof(BYTE),fpi);
fread((char *)&(strPla[nCounti].rgbReserved),1,sizeof(BYTE),fpi);
}

width = strInfo.biWidth;
height = strInfo.biHeight;
//图像每一行的字节数必须是4的整数倍
width = (width * sizeof(IMAGEDATA) + 3) / 4 * 4;
//imagedata = (IMAGEDATA*)malloc(width * height * sizeof(IMAGEDATA));
imagedata = (IMAGEDATA*)malloc(width * height);
imagedataverage = (IMAGEDATA*)malloc(width *height * sizeof(IMAGEDATA));
imagedatalevel = (IMAGEDATA*)malloc(width *height * sizeof(IMAGEDATA));
imagedatavertical = (IMAGEDATA*)malloc(width *height * sizeof(IMAGEDATA));
//初始化原始图片的像素数组
for(int i = 0;i < height;++i)
{
for(int j = 0;j < width;++j)
{
(*(imagedata + i * width + j)).blue = 0;
//(*(imagedata + i * width + j)).green = 0;
//(*(imagedata + i * width + j)).red = 0;
}
}
//初始化均衡化后图片的像素数组
for(int i = 0;i <height;++i)
{
for(int j = 0;j <width;++j)
{
(*(imagedataverage + i*width + j)).blue = 0;
//(*(imagedataverage + i*width + j)).green = 0;
//(*(imagedataverage + i*width + j)).red = 0;
}
}
//fseek(fpi,54,SEEK_SET);
//读出图片的像素数据
fread(imagedata,sizeof(struct tagIMAGEDATA) * width,height,fpi);
fclose(fpi);
}
else
{
cout<<"file open error!"<<endl;
return (1);
}
/*
//图片旋转处理
int RotateAngle;//要旋转的角度数
double angle;//要旋转的弧度数
int midX_pre,midY_pre,midX_aft,midY_aft;//旋转所围绕的中心点的坐标
midX_pre = width / 2;
midY_pre = height / 2;
midX_aft = width;
midY_aft = height;
int pre_i,pre_j,after_i,after_j;//旋转前后对应的像素点坐标
cout<<"输入要旋转的角度(0度到360度,逆时针旋转):"<<endl;
cin>>RotateAngle;
angle = 1.0 * RotateAngle * PI / 180;
for(int i = 0;i < 2 * height;++i)
{
for(int j = 0;j < 2 * width;++j)
{
after_i = i - midX_aft;//坐标变换
after_j = j - midY_aft;
pre_i = (int)(cos((double)angle) * after_i - sin((double)angle) * after_j) + midX_pre;
pre_j = (int)(sin((double)angle) * after_i + cos((double)angle) * after_j) + midY_pre;
if(pre_i >= 0 && pre_i < height && pre_j >= 0 && pre_j < width)//在原图范围内
*(imagedataRot + i * 2 * width + j) = *(imagedata + pre_i * width + pre_j);
}
} */

//sober
for (int i=0;i<height;i++)
for (int j=0;j<width;j++)
{
(*(imagedatalevel + i*width + j)).blue=(*(imagedata + i*width + j)).blue;
(*(imagedatavertical + i*width + j)).blue=(*(imagedata + i*width + j)).blue;
(*(imagedataverage + i*width + j)).blue=(*(imagedata + i*width + j)).blue;
}

for ( int i=1;i<height-1;i++)
for (int j=1;j<width-1;j++)
{
(*(imagedatalevel + i * width + j)).blue =
abs((*(imagedata + (i + 1) * width + j - 1)).blue - (*(imagedata + (i - 1) * width + j - 1)).blue +
2 * ((*(imagedata + (i + 1) * width + j)).blue - (*(imagedata + (i - 1) * width + j)).blue) +
(*(imagedata + (i + 1) * width + j + 1)).blue - (*(imagedata + (i - 1) * width + j + 1)).blue);
(*(imagedatavertical + i * width + j)).blue =
abs((*(imagedata + (i - 1) * width + j + 1)).blue - (*(imagedata + (i - 1) * width + j - 1)).blue +
2 * ((*(imagedata + i * width + j + 1)).blue - (*(imagedata + i * width + j - 1)).blue) +
(*(imagedata + (i + 1) * width + j + 1)).blue - (*(imagedata + (i + 1) * width + j - 1)).blue);
}
int s;
for (int i=1;i<height-1;i++)
for (int j=1;j<width-1;j++)
{
s=(int)(*(imagedatalevel + i*width + j)).blue+ (int)(*(imagedatavertical+ i*width + j)).blue;
if(s>255)
(*(imagedataverage + i*width + j)).blue=(BYTE)255;
else
(*(imagedataverage + i*width + j)).blue=(BYTE)s;

}

int k=(int)sqrt(width*width+height*height);//k为原图对角线距离
int p=0;
double A[270][k];
for(int i=0;i<270;i++)
for(int j=0;j<k;j++)
{A[i][j]=0;
}
for (int i=1;i<height;i++)
for (int j=1;j<width;j++)
{
float rho = (int)(atan(1.0*i/j)*180/PI);
if((imagedataverage+i*width+j)->blue < 126)continue;//限制灰度范围
for (int m=90-rho;m<270-rho;m++)
{
if((m%90==0)||(abs(m-225)<15)||(abs(m-135)<10))//限制角度范围来限制直线的范围
{
float t=((m-90)/180.0)*PI;
p=(int)(i*cos(t)+j*sin(t));//计算极径p
if(p<k)
A[m][p]++;
}
}
}
for (int i=1;i<height;i++)
for (int j=1;j<width;j++)
{
float rho = (int)(atan(1.0*i/j)*180/PI);
for (int m=90-rho;m<270-rho;m++)
{
float t=((m-90)/180.0)*PI;
p=(int)(i*cos(t)+j*sin(t));
if(p<k&&A[m][p] > 175)
(*(imagedata + i*width + j)).blue=255;

}
}

//保存bmp图片
if((fpw=fopen("result.bmp","wb"))==NULL)
{
cout<<"create the bmp file error!"<<endl;
return (1);
}
WORD bfType_w=0x4d42;
fwrite(&bfType_w,1,sizeof(WORD),fpw);
//fpw +=2;
fwrite(&strHead,1,sizeof(tagBITMAPFILEHEADER),fpw);
strInfo.biWidth = width;
strInfo.biHeight = height;
fwrite(&strInfo,1,sizeof(tagBITMAPINFOHEADER),fpw);
//保存调色板数据
for(unsigned int nCounti=0;nCounti<strInfo.biClrUsed;nCounti++)
{
fwrite(&strPla[nCounti].rgbBlue,1,sizeof(BYTE),fpw);
fwrite(&strPla[nCounti].rgbGreen,1,sizeof(BYTE),fpw);
fwrite(&strPla[nCounti].rgbRed,1,sizeof(BYTE),fpw);
fwrite(&strPla[nCounti].rgbReserved,1,sizeof(BYTE),fpw);
}
//保存像素数据
for( int i =0;i < height;++i)
{
for(int j = 0;j < width;++j)
{
fwrite( &((*(imagedata + i * width + j)).blue),1,sizeof(BYTE),fpw);
//fwrite( &((*(imagedataverage + i * 2 * width + j)).green),1,sizeof(BYTE),fpw);
//fwrite( &((*(imagedataverage + i * 2 * width + j)).red),1,sizeof(BYTE),fpw);
}
}
fclose(fpw);

//释放内存
delete[] imagedata;
delete[] imagedataverage;
}

#include <stdio.h>
#include "c.h"
#include "stdlib.h"
#include "math.h"
#include <iostream>

#define PI 3.14159//圆周率宏定义
#define LENGTH_NAME_BMP 30//bmp图片文件名的最大长度

using namespace std;

//变量定义
BITMAPFILEHEADER strHead;
RGBQUAD strPla[256];//256色调色板
BITMAPINFOHEADER strInfo;

//显示位图文件头信息
void showBmpHead(BITMAPFILEHEADER pBmpHead){
cout<<"位图文件头:"<<endl;
cout<<"文件大小:"<<pBmpHead.bfSize<<endl;
cout<<"保留字_1:"<<pBmpHead.bfReserved1<<endl;
cout<<"保留字_2:"<<pBmpHead.bfReserved2<<endl;
cout<<"实际位图数据的偏移字节数:"<<pBmpHead.bfOffBits<<endl<<endl;
}

void showBmpInforHead(tagBITMAPINFOHEADER pBmpInforHead){
cout<<"位图信息头:"<<endl;
cout<<"结构体的长度:"<<pBmpInforHead.biSize<<endl;
cout<<"位图宽:"<<pBmpInforHead.biWidth<<endl;
cout<<"位图高:"<<pBmpInforHead.biHeight<<endl;
cout<<"biPlanes平面数:"<<pBmpInforHead.biPlanes<<endl;
cout<<"biBitCount采用颜色位数:"<<pBmpInforHead.biBitCount<<endl;
cout<<"压缩方式:"<<pBmpInforHead.biCompression<<endl;
cout<<"biSizeImage实际位图数据占用的字节数:"<<pBmpInforHead.biSizeImage<<endl;
cout<<"X方向分辨率:"<<pBmpInforHead.biXPelsPerMeter<<endl;
cout<<"Y方向分辨率:"<<pBmpInforHead.biYPelsPerMeter<<endl;
cout<<"使用的颜色数:"<<pBmpInforHead.biClrUsed<<endl;
cout<<"重要颜色数:"<<pBmpInforHead.biClrImportant<<endl;
}

int main(){
char strFile[LENGTH_NAME_BMP];//bmp文件名
IMAGEDATA *imagedata = NULL;//动态分配存储原图片的像素信息的二维数组
IMAGEDATA *imagedataverage = NULL;//动态分配存储旋转后的图片的像素信息的二维数组
IMAGEDATA *imagedatalevel = NULL;
IMAGEDATA *imagedatavertical = NULL;
int width,height;//图片的宽度和高度
cout<<"请输入所要读取的文件名:"<<endl;
cin>>strFile;
FILE *fpi,*fpw;
fpi=fopen(strFile,"rb");
if(fpi != NULL){
//先读取文件类型
WORD bfType;
fread(&bfType,1,sizeof(WORD),fpi);
if(0x4d42!=bfType)
{
cout<<"the file is not a bmp file!"<<endl;
return (1);
}
//读取bmp文件的文件头和信息头
fread(&strHead,1,sizeof(tagBITMAPFILEHEADER),fpi);
//showBmpHead(strHead);//显示文件头
fread(&strInfo,1,sizeof(tagBITMAPINFOHEADER),fpi);
//showBmpInforHead(strInfo);//显示文件信息头

//读取调色板
for(unsigned int nCounti=0;nCounti<strInfo.biClrUsed;nCounti++)
{
fread((char *)&(strPla[nCounti].rgbBlue),1,sizeof(BYTE),fpi);
fread((char *)&(strPla[nCounti].rgbGreen),1,sizeof(BYTE),fpi);
fread((char *)&(strPla[nCounti].rgbRed),1,sizeof(BYTE),fpi);
fread((char *)&(strPla[nCounti].rgbReserved),1,sizeof(BYTE),fpi);
}

width = strInfo.biWidth;
height = strInfo.biHeight;
//图像每一行的字节数必须是4的整数倍
width = (width * sizeof(IMAGEDATA) + 3) / 4 * 4;
//imagedata = (IMAGEDATA*)malloc(width * height * sizeof(IMAGEDATA));
imagedata = (IMAGEDATA*)malloc(width * height);
imagedataverage = (IMAGEDATA*)malloc(width *height * sizeof(IMAGEDATA));
imagedatalevel = (IMAGEDATA*)malloc(width *height * sizeof(IMAGEDATA));
imagedatavertical = (IMAGEDATA*)malloc(width *height * sizeof(IMAGEDATA));
//初始化原始图片的像素数组
for(int i = 0;i < height;++i)
{
for(int j = 0;j < width;++j)
{
(*(imagedata + i * width + j)).blue = 0;
//(*(imagedata + i * width + j)).green = 0;
//(*(imagedata + i * width + j)).red = 0;
}
}
//初始化均衡化后图片的像素数组
for(int i = 0;i <height;++i)
{
for(int j = 0;j <width;++j)
{
(*(imagedataverage + i*width + j)).blue = 0;
//(*(imagedataverage + i*width + j)).green = 0;
//(*(imagedataverage + i*width + j)).red = 0;
}
}
//fseek(fpi,54,SEEK_SET);
//读出图片的像素数据
fread(imagedata,sizeof(struct tagIMAGEDATA) * width,height,fpi);
fclose(fpi);
}
else
{
cout<<"file open error!"<<endl;
return (1);
}
/*
//图片旋转处理
int RotateAngle;//要旋转的角度数
double angle;//要旋转的弧度数
int midX_pre,midY_pre,midX_aft,midY_aft;//旋转所围绕的中心点的坐标
midX_pre = width / 2;
midY_pre = height / 2;
midX_aft = width;
midY_aft = height;
int pre_i,pre_j,after_i,after_j;//旋转前后对应的像素点坐标
cout<<"输入要旋转的角度(0度到360度,逆时针旋转):"<<endl;
cin>>RotateAngle;
angle = 1.0 * RotateAngle * PI / 180;
for(int i = 0;i < 2 * height;++i)
{
for(int j = 0;j < 2 * width;++j)
{
after_i = i - midX_aft;//坐标变换
after_j = j - midY_aft;
pre_i = (int)(cos((double)angle) * after_i - sin((double)angle) * after_j) + midX_pre;
pre_j = (int)(sin((double)angle) * after_i + cos((double)angle) * after_j) + midY_pre;
if(pre_i >= 0 && pre_i < height && pre_j >= 0 && pre_j < width)//在原图范围内
*(imagedataRot + i * 2 * width + j) = *(imagedata + pre_i * width + pre_j);
}
} */

//sober
for (int i=0;i<height;i++)
for (int j=0;j<width;j++)
{
(*(imagedatalevel + i*width + j)).blue=(*(imagedata + i*width + j)).blue;
(*(imagedatavertical + i*width + j)).blue=(*(imagedata + i*width + j)).blue;
(*(imagedataverage + i*width + j)).blue=(*(imagedata + i*width + j)).blue;
}

for ( int i=1;i<height-1;i++)
for (int j=1;j<width-1;j++)
{
(*(imagedatalevel + i * width + j)).blue =
abs((*(imagedata + (i + 1) * width + j - 1)).blue - (*(imagedata + (i - 1) * width + j - 1)).blue +
2 * ((*(imagedata + (i + 1) * width + j)).blue - (*(imagedata + (i - 1) * width + j)).blue) +
(*(imagedata + (i + 1) * width + j + 1)).blue - (*(imagedata + (i - 1) * width + j + 1)).blue);
(*(imagedatavertical + i * width + j)).blue =
abs((*(imagedata + (i - 1) * width + j + 1)).blue - (*(imagedata + (i - 1) * width + j - 1)).blue +
2 * ((*(imagedata + i * width + j + 1)).blue - (*(imagedata + i * width + j - 1)).blue) +
(*(imagedata + (i + 1) * width + j + 1)).blue - (*(imagedata + (i + 1) * width + j - 1)).blue);
}
int s;
for (int i=1;i<height-1;i++)
for (int j=1;j<width-1;j++)
{
s=(int)(*(imagedatalevel + i*width + j)).blue+ (int)(*(imagedatavertical+ i*width + j)).blue;
if(s>255)
(*(imagedataverage + i*width + j)).blue=(BYTE)255;
else
(*(imagedataverage + i*width + j)).blue=(BYTE)s;

}

int k=(int)sqrt(width*width+height*height);//k为原图对角线距离
int p=0;
double A[270][k];
for(int i=0;i<270;i++)
for(int j=0;j<k;j++)
{A[i][j]=0;
}
for (int i=1;i<height;i++)
for (int j=1;j<width;j++)
{
float rho = (int)(atan(1.0*i/j)*180/PI);
if((imagedataverage+i*width+j)->blue < 126)continue;//限制灰度范围
for (int m=90-rho;m<270-rho;m++)
{
if((m%90==0)||(abs(m-225)<15)||(abs(m-135)<10))//限制角度范围来限制直线的范围
{
float t=((m-90)/180.0)*PI;
p=(int)(i*cos(t)+j*sin(t));//计算极径p
if(p<k)
A[m][p]++;
}
}
}
for (int i=1;i<height;i++)
for (int j=1;j<width;j++)
{
float rho = (int)(atan(1.0*i/j)*180/PI);
for (int m=90-rho;m<270-rho;m++)
{
float t=((m-90)/180.0)*PI;
p=(int)(i*cos(t)+j*sin(t));
if(p<k&&A[m][p] > 175)
(*(imagedata + i*width + j)).blue=255;

}
}

//保存bmp图片
if((fpw=fopen("result.bmp","wb"))==NULL)
{
cout<<"create the bmp file error!"<<endl;
return (1);
}
WORD bfType_w=0x4d42;
fwrite(&bfType_w,1,sizeof(WORD),fpw);
//fpw +=2;
fwrite(&strHead,1,sizeof(tagBITMAPFILEHEADER),fpw);
strInfo.biWidth = width;
strInfo.biHeight = height;
fwrite(&strInfo,1,sizeof(tagBITMAPINFOHEADER),fpw);
//保存调色板数据
for(unsigned int nCounti=0;nCounti<strInfo.biClrUsed;nCounti++)
{
fwrite(&strPla[nCounti].rgbBlue,1,sizeof(BYTE),fpw);
fwrite(&strPla[nCounti].rgbGreen,1,sizeof(BYTE),fpw);
fwrite(&strPla[nCounti].rgbRed,1,sizeof(BYTE),fpw);
fwrite(&strPla[nCounti].rgbReserved,1,sizeof(BYTE),fpw);
}
//保存像素数据
for( int i =0;i < height;++i)
{
for(int j = 0;j < width;++j)
{
fwrite( &((*(imagedata + i * width + j)).blue),1,sizeof(BYTE),fpw);
//fwrite( &((*(imagedataverage + i * 2 * width + j)).green),1,sizeof(BYTE),fpw);
//fwrite( &((*(imagedataverage + i * 2 * width + j)).red),1,sizeof(BYTE),fpw);
}
}
fclose(fpw);

//释放内存
delete[] imagedata;
delete[] imagedataverage;
}

hough变换的更多相关文章

  1. hough变换检测线和圆

    参考:http://blog.163.com/yuyang_tech/blog/static/21605008320130233343990/ 这篇介绍的基本思想. http://www.cnblog ...

  2. OpenCV2马拉松第22圈——Hough变换直线检測原理与实现

    计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/27220445 收入囊中 Hough变换 概率Ho ...

  3. hough变换是如何检测出直线和圆的?

    (I)直线篇 1 直线是如何表示的?对于平面中的一条直线,在笛卡尔坐标系中,常见的有点斜式,两点式两种表示方法.然而在hough变换中,考虑的是另外一种表示方式:使用(r,theta)来表示一条直线. ...

  4. Hough变换在opencv中的应用

    霍夫曼变换(Hough Transform)的原理 霍夫曼变换是一种可以检测出某种特殊形状的算法,OpenCV中用霍夫曼变换来检测出图像中的直线.椭圆和其他几何图形.由它改进的算法,可以用来检测任何形 ...

  5. Matlab实现Hough变换检測图像中的直线

    Hough变换的原理: 将图像从图像空间变换至參数空间.变换公式例如以下: 变换以后,图像空间与參数空间存在下面关系: 图像空间中的一点在參数空间是一条曲线,而图像空间共线的各点相应于參数空间交于一点 ...

  6. Hough变换-理解篇

    Hough变换-理解篇 霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体.该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符 ...

  7. Hough变换的基本思考

    一,概念: Hough变换用于在图像中检测特定性状,如线,圆,矩形等,广泛用于图像识别领域. 二,原理: 1,Hough变换直线检测: 一条直接的方程可表示为:y = a*x + b ,当a,b固定时 ...

  8. 查找图像中椭圆轮廓的快速随机hough变换

    查找图像中椭圆轮廓的快速随机hough变换 图像中椭圆轮廓的查找在视频监控等领域有着广泛的应用,经典hough变换给我们提供了一种查找各种图形轮廓的方法,特别是在直线查找方面具有非常高的精确度.但是由 ...

  9. Hough变换原理

    Hough变换原理 一.简单介绍 Hough变换是图像处理中从图像中识别几何形状的基本方法之一.Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的 ...

  10. 利用Hough变换识别图像中的直线

    引入 近期看到2015年数学建模A题太阳影子定位中的第四问,需要根据附件中视频里的直杆的太阳影子的变化确定拍摄地点.其实确定拍摄地点这个问题并不是十分困难,因为有前三问的铺垫,我们已经得出了太阳影子长 ...

随机推荐

  1. Async 、 Await 的异步编程(.NET 4.5 新异步模型) [转自MSDN]

    使用异步编程,可以避免性能瓶颈和增强应用程序的总体响应能力. 但是,编写异步应用程序的以前的技术可能比较复杂,使它们难以编写,调试和维护. Visual Studio 2012 引入了一个简化的方法, ...

  2. Redis性能测试工具benchmark简介

    Redis自己提供了一个性能测试工具redis-benchmark.redis-benchmark可以模拟N个机器,同时发送M个请求. 用法:redis-benchmark [-h -h <ho ...

  3. bzoj2537: [neerc2007]Language Recognition

    Description DFA(确定性有限状态自动机)是一个有向图,顶点称为状态,边称为转移.每个转移用一个字母标记.对于每个状态s和每个转移l,至多有一个转移从s出发且标记为l.DFA有一个初始状态 ...

  4. Avant Browser

    Avant Browser Avant 浏览器友好的用户界面为你的网络冲浪带来全新的效率和透明性.软件版本的不断升级使产品的可靠性稳步提高. 没有广告.没有恶意软件! Avant 浏览器是免费的.10 ...

  5. Windows Server 2008 - How to Move the Quorum Disk Group

    I received this question from a friend the other day - asking how on a Windows Server 2008 cluster y ...

  6. 如何在VBA窗体中使用 DataGrid 控件?

    1.下载MSDATGRD.cab,下载路径如下:http://www.findthatzipfile.com/search-10500733-hZIP/winrar-winzip-download-m ...

  7. 黄聪:TinyMCE 4 增强 添加样式、按钮、字体、下拉菜单和弹出式窗口

    我最喜欢 WordPress 3.9 的更新是使用了 TinyMCE 4.0 编辑器.新的 TinyMCE 看起来看起来更整洁(真正匹配WP仪表板),它有一些非常不错的附加功能.我的很多老主题和插件必 ...

  8. duplicate symbols

    duplicate symbol _mCollecatView in: /Users/Rubert/Library/Developer/Xcode/DerivedData/ChengDuHidengD ...

  9. Java利用MessageDigest提供的MD5算法加密字符串或文件

    MD5是常用的加密算法,也经常用于校验信息完整,如文件的完整性.用术语讲,MD5是一种消息摘要算法(Message Digest Algorithm).另外还有一种常用的消息摘要算法SHA1.如果想了 ...

  10. NeHe OpenGL教程 第一课:OpenGL窗口

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...