没有合适的资源?快使用搜索试试~ 我知道了~
图像处理之霍夫变换.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 142 浏览量
2022-06-18
02:55:51
上传
评论
收藏 276KB DOCX 举报
温馨提示
试读
12页
图像处理之霍夫变换.docx图像处理之霍夫变换.docx图像处理之霍夫变换.docx图像处理之霍夫变换.docx图像处理之霍夫变换.docx图像处理之霍夫变换.docx图像处理之霍夫变换.docx图像处理之霍夫变换.docx
资源推荐
资源详情
资源评论
图像处理之霍夫变换(直线检测算法)
霍夫变换是图像变换中的经典手段之一,主要用来从图像中分离出具有某种相同
特征的几何
形状(如,直线,圆等)。霍夫变换寻找直线与圆的方法相比与其它方法可以更
好的减少噪
霍夫变换算法思想:
以直线检测为例,每个像素坐标点经过变换都变成都直线特质有贡献的统一度量,
一个简单
的例子如下:一条直线在图像中是一系列离散点的集合,通过一个直线的离散极
坐标公式,
可以表达出直线的离散点几何等式如下:
X *cos(theta) + y * sin(theta) = r 其中角度 theta 指 r 与 X 轴之间的夹角,r 为
到直线几何垂
直距离。任何在直线上点,x, y 都可以表达,其中 r, theta 是常量。该公式图
形表示如下:
然而在实现的图像处理领域,图像的像素坐标 P(x, y)是已知的,而 r, theta 则是
的变量。如果我们能绘制每个(r, theta)值根据像素点坐标 P(x, y)值的话,那么就
从图像笛卡
尔坐标系统转换到极坐标霍夫空间系统,这种从点到曲线的变换称为直线的霍夫
变换。变换
通过量化霍夫参数空间为有限个值间隔等分或者累加格子。当霍夫变换算法开始,
每个像素
坐标点 P(x, y)被转换到(r, theta)的曲线点上面,累加到对应的格子数据点,当一
时候,说明有直线存在。同样的原理,我们可以用来检测圆,只是对于圆的参数
方程变为如
(x –a ) ^2 + (y-b) ^ 2 = r^2 其中(a, b)为圆的中心点坐标,r 圆的半径。这样霍夫
的参数空间就
变成一个三维参数空间。给定圆半径转为二维霍夫参数空间,变换相对简单,也
比较常用。
1.
2.
3.
4.
5.
根据直线的霍夫变换公式完成霍夫变换,预览霍夫空间结果
寻找最大霍夫值,设置阈值,反变换到图像 RGB 值空间(程序难点之一)
越界处理,显示霍夫变换处理以后的图像
直线的变换角度为[0 ~ PI]之间,设置等份为 500 为 PI/500,同时根据参数直线
参数方程的取值
范围为[-r, r]有如下霍夫参数定义:
[java] view plaincopy
1. // prepare for hough transform
2. int centerX = width / 2;
3. int centerY = height / 2;
4. double hough_interval = PI_VALUE/(double)hough_space;
5.
6. int max = Math.max(width, height);
7. int max_length = (int)(Math.sqrt(2.0D) * max);
8. hough_1d = new int[2 * hough_space * max_length];
实现从像素 RGB 空间到霍夫空间变换的代码为:
[java] view plaincopy
2. int[][] image_2d = convert1Dto2D(inPixels);
3. for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
int p = image_2d[row][col] & 0xff;
// since we does not know the theta angle and r value,
// we have to calculate all hough space for each pixel point
// then we got the max possible theta and r pair.
// r = x * cos(theta) + y * sin(theta)
for(int cell=0; cell < hough_space; cell++ ) {
max = (int)((col - centerX) * Math.cos(cell * hough_interval) +
(row - centerY) * Math.sin(cell * hough_interval));
max += max_length; // start from zero, not (-max_length)
if (max < 0 || (max >= 2 * max_length)) {// make sure r did not
out of scope[0, 2*max_lenght]
hough_2d[cell][max] +=1;
21. }
[java] view plaincopy
4.
5.
6.
7. max_hough = hough_2d[i][j];
剩余11页未读,继续阅读
资源评论
苦茶子12138
- 粉丝: 1w+
- 资源: 6万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功