图像处理 C语言 hough变换 检测直线
来源:互联网 发布:网络安全生产会议内容 编辑:程序博客网 时间:2024/05/17 22:25
一天从网上下了20个vc的hough代码,没有一个代码是成功的。令人郁闷,我参考matlab代码写出了hough检测单个直线的程序
Hough变换:
本程序是我花费时间最长的程序;参考matlab算法;首先求出原图上的每一个像素在变换域上的对应曲线,即原图上每一点(i,j)对应变换域曲线(p,k);p=(int)(i*cos(pi*k/180)+j*sin(pi*k/180))(0<k<180);
然后遍历(i,j),累加变换域重复出现的位置,即曲线的交点
然后遍历累加器,寻找交点最大的数据,找出对应的原图坐标,即为所求直线
主要代码
for(i=0;i<img.height;i++) //转化成灰度
{
for(j=0,n=0;n<img.width*3,j<img.width;n+=3,j++)
{ //gray 变量存储rgb转灰度的数据
gray= ((float)(img.image[lineBytes*i+n+2])+(float)(*(img.image+lineBytes*i+n+1))+(float)(*(img.image+lineBytes*i+n)))/3; //lineBytes 原图每行实际字节数
grayPic[i*img.width+j]=(byte)gray;//转换成的灰度图像放在grayPic中
}
}
int logNum; //边缘检测
memset(lpDIBBits,(byte)0,sizeof(byte)*img.height*img.width);
for(i=3;i<img.height-2;i++)
for(j=3;j<img.width-2;j++)
{
//logNum 变量 记录每次运算的值
logNum=16*grayPic[i*img.width+j]-grayPic[(i-2)*img.width+j]-grayPic[(i-1)*img.width+j-1]-2*grayPic[(i-1)*img.width+j]-grayPic[(i-1)*img.width+j+1]-grayPic[i*img.width+j-2]-2*grayPic[i*img.width+j-1]-2*grayPic[i*img.width+j+1]-grayPic[i*img.width+j+2]-grayPic[(i+1)*img.width+j-1]-2*grayPic[(i+1)*img.width+j]-grayPic[(i+1)*img.width+j+1]-grayPic[(i+2)*img.width+j];//log算子
if(logNum > 0)
lpDIBBits[i*img.width+j]=255;//边缘检测后的数据存放在lpDIBBits中
else
lpDIBBits[i*img.width+j]=0;
}
for(i=1;i<img.height;i++) //img.height原图高度
for(j=1;j<img.width;j++) //img.width 原图宽度
{
if(lpDIBBits[i*img.width+j]==255) //对边缘检测后的数据(存在lpDIBBits中)进行hough变化
{
for(k=1;k<ma;k++) //ma=180
{
p=(int)(i*cos(pi*k/180)+j*sin(pi*k/180));//p hough变换中距离参数
p=(int)(p/2+mp/2); //对p值优化防止为负
npp[k][p]=npp[k][p]++; //npp对变换域中对应重复出现的点累加
}
}
}
kmax=0; //最长直线的角度
pmax=0; //最长直线的距离
n=0; //这一部分为寻找最长直线
for(i=1;i<ma;i++) //ma=180
for(j=1;j<mp;j++) //mp为原图对角线距离
{
if(npp[i][j]>yuzhi) //找出最长直线 yuzhi为中间变量用于比较
{
yuzhi=npp[i][j];
kmax=i; //记录最长直线的角度
pmax=j; //记录最长直线的距离
}
}
memset(temp,(byte)255,sizeof(byte)*img.width*img.height);//原图中坐标符合kmax和pmax的值
for(i=1;i<img.height;i++) //的集合即是最长的直线
for(j=1;j<img.width;j++)
{
if(lpDIBBits[i*img.width+j]==255)
{
p=(int)(i*cos(pi*kmax/180)+j*sin(pi*kmax/180));//pi=3.1415926
p=(int)(p/2+mp/2); //mp为原图对角线距离
if(p==pmax)
*(temp+i*img.width+j)=0; //存储图像数据 放在temp数组中
}
}
右边是原图,里面有圆和直线,左边是经过hough变换检测出的直线(版权所有 欢迎交流)
- 图像处理 C语言 hough变换 检测直线
- 图像处理 C语言 hough变换 检测直线
- Win8 Metro(C#)数字图像处理--2.38Hough变换直线检测
- Hough变换检测直线
- Hough 变换检测直线
- Hough变换检测直线
- Hough变换直线检测
- hough变换检测直线
- Hough变换检测直线
- Hough变换直线检测
- Hough变换-直线检测
- Hough变换直线检测
- Hough变换检测直线
- Hough变换检测直线
- Hough变换检测直线
- Hough变换直线检测
- Hough变换检测直线
- Matlab实现Hough变换检测图像中的直线
- Linux syslog日志监控服务器
- 图像处理 C语言 文本图像的倾斜校正
- Linxu之静态库生成和使用
- Evernote进军Web阅读,推出Clearly为你格式化网页
- Android make: How to control which module is built
- 图像处理 C语言 hough变换 检测直线
- 杨毅:不够优秀就不要腆着脸继续占便宜
- Android各个版本号,发行时间以及版本代号
- 深入理解C++的new()
- TF 卡 的教训
- 测试
- 第一个struts2应用程序的创建
- Android 官方文档之Activity和Task
- 手把手教你selenium_搭建环境_软件安装