检测提取图像中的直线(基于霍夫变换)
在http://blog.csdn.net/piaoxuezhong/article/details/58587907中,介绍的基于霍夫变换检测直线的原理,并给出了opencv算法实现,本篇再次使用霍夫变换在matlab中检测图像中的直线。
具体步骤:
1. 彩色图像->灰度图
2. 去噪(高斯核)
3. 边缘提取(梯度算子、拉普拉斯算子、canny、sobel)
4. 二值化(判断此处是否为边缘点,就看灰度值==255)
5. 映射到霍夫空间(准备两个容器,一个用来展示hough-space概况,一个数组hough-space用来储存voting的值,因为投票过程往往有某个极大值超过阈值,多达几千,不能直接用灰度图来记录投票信息)
6. 取局部极大值,设定阈值,过滤干扰直线
7. 绘制直线、标定角点
Matlab实现:
1. 转灰度: Img=rgb2gray(Img)
2. 高斯去噪
3. sobel算子提取边界
4. 二值化(应该设置一个阈值,对不同的图,不同的阈值,以便完整显示边界)
在高斯去噪和边界提取之后都需要二值化
5. 映射到霍夫空间
先在原图构造一个x-y平面,一一对应各点的直线方程计算O(0,0)为事实上的原点,O‘(width/2,height/2)为构造平面的原点,然后构造一个hough-space,其中纵轴表示theta的刻度,theta取值0~PI,分成500个刻度,r的最大值为: max_length=sqrt((width/2)^2 + (height/2)^2),又r存在正负值,故而hough-space的横轴需要2*max_length。
%% 图像中直线检测
function I_out=HoughLineDetect(Img,thresholdValue)
%input:
% img:输入图像;
% thresholdValue:hough阈值;
%output:
% I_out:检测直线结果,二值图像;if ~exist( 'thresholdValue', 'var' )thresholdValue = 150;endif length(size(Img))>2I_gray=rgb2gray(Img); %如果输入图像是彩色图,需要转灰度图elseI_gray=Img;end[x,y]=size(I_gray); %图像大小BW=edge(I_gray); %计算图像边缘rho_max=floor(sqrt(x^2+y^2))+1; %由图像坐标算出ρ最大值,结果取整并加1,作为极坐标系最大值AccArray=zeros(rho_max,180); %初始化极坐标系的数组Theta=0:pi/180:pi; %定义θ数组,范围从0-180度for n=1:x,for m=1:yif BW(n,m)==1for k=1:180%hough变换方程求ρ值rho=(m*cos(Theta(k)))+(n*sin(Theta(k)));%为了防止ρ值出现负数,将ρ值与ρ最大值的和的一半作为ρ的坐标值rho_int=round(rho/2+rho_max/2);%在极坐标中标识点,相同点累加AccArray(rho_int,k)=AccArray(rho_int,k)+1;endendendend%利用hough变换提取直线K=1; %存储数组计数器
% thresholdValue=200; %设定直线的最小值。for rho=1:rho_max %在hough变换后的数组中搜索for theta=1:180if AccArray(rho,theta)>=thresholdValue case_accarray_rho(K)=rho; case_accarray_theta(K)=theta;K=K+1;endendend%将直线提取出来,输出图像数组I_outI_out=zeros(x,y);for n=1:x,for m=1:yif BW(n,m)==1for k=1:180rho=(m*cos(Theta(k)))+(n*sin(Theta(k)));rho_int=round(rho/2+rho_max/2);for a=1:K-1if rho_int==case_accarray_rho(a)&&k==case_accarray_theta(a)I_out(n,m)=BW(n,m); endendendendendendfigure,imshow(Img);title('输入图像');% figure,imshow(BW);title('edge处理后的边界图');figure,imshow(I_out);title('Hough变换检测出的直线');end
测试文件及结果:
%% 图像直线检测测试程序
clc,clear all,close all;
imgPath='D:\test_image\exposure_image\';
img=imread(fullfile(imgPath,'4.jpg'));
I_out=HoughLineDetect(img,60);
程序里,输入参数除了图像,还一个是投票阈值,为了可以方便修改,如果不带这个参数,程序里默认是150。
参考:
http://blog.csdn.net/piaoxuezhong/article/details/58587907
https://www.cnblogs.com/cheermyang/p/5348820.html
检测提取图像中的直线(基于霍夫变换)相关推荐
- 图像分割实战之基于Hough变换提取图像中的直线
图像分割的依据是基于图像中各区域具有不同的特性(比如,灰度.颜色.纹理).图像分割的目的是将图像划分成若干具有相近或相同特性的子区域,以便继续在分割成的相关区域中提取目标,并进而根据目标的特征或结构信 ...
- hough变换检测直线 matlab,Matlab实现Hough变换检测图像中的直线
Hough变换的原理: 将图像从图像空间变换至参数空间,变换公式如下: 变换以后,图像空间与参数空间存在以下关系: 图像空间中的一点在参数空间是一条曲线,而图像空间共线的各点对应于参数空间交于一点的各 ...
- echarts怎么控制一个点沿着折线移动_计算机怎么识别图像中的直线?
1 直线检测问题 在纸上画一条直线,用手机拍下照片,把照片交给计算机识别. 计算机是如何知道这张照片中的这条直线的? 存在直线吗? 直线在哪里? 点.线.面是基本的几何元素. 欧几里得在<几何原 ...
- 平行坐标系下采用CHT方法检测自然图像中的消失点(VanishingPoint)
--------------------20210826更新-------------------- code和paper链接:https://pan.baidu.com/s/13RyRu0rg7Fh ...
- MATLAB#183;提取图像中多个目标
基于matlab工具箱提取图像中的多目标特征(代码如下): 代码前面部分为提取图像的边界信息,调用了后面的遍历函数Pixel_Search,函数实现方法见后~ %%ROI Testing close ...
- MATLAB·提取图像中多个目标
基于matlab工具箱提取图像中的多目标特征(代码如下): 代码前面部分为提取图像的边界信息,调用了后面的遍历函数Pixel_Search,函数实现方法见后~ %%ROI Testing close ...
- 使用Python,OpenCV+OCR检测护照图像中的机器可读区域(MRZ Machine-Readable Zones)
使用Python,OpenCV+OCR检测护照图像中的机器可读区域(MRZ Machine-Readable Zones) 1. 效果图 2. 原理 3. 源码 参考 这篇博客将介绍如何只使用基本的图 ...
- 【论文党福利】如何提取图像中的数据
[论文党福利]如何提取图像中的数据 从事科研的老师和同学们在撰写论文时,经常需要将文献中的曲线与自己的结果进行对比,为获取原始数据,最靠谱的方法当然是找原作者要.如果没有要到呢?本文将成为论文党的福利 ...
- 教你如何用Python检测出图像中的黄色?都在这里!
首先,这里不搞黄色,只搞学习,希望大家好好学习,争取早日变成大佬,升职加薪.当上总经理.出任CEO.迎娶白富美.走上人生巅峰,想想是不是有点小激动. 等等,别跑偏了,接下来开始学习. 有时我们需要检测 ...
- Opencv学习笔记(二) 提取图像中的水平线和垂直线
提取图像中的水平线和垂直线属于基础的形态学操作的应用,原理:根据要提取图形来定义一个特定的结构元素,然后以这个结构相素去遍历图像,进行一系列形态学操作,以此过滤掉其他特征的图形,达到提取的效果. 示例 ...
最新文章
- cad画流程图的插件_CAD制图太慢?62款辅助插件汇总,款款精品,效率提升80%
- matlab求被21整除,用matlab求[100,999]之间能被21整除的数的个数,还有建立一个字符串向量,删除大写字母._...
- Java中的字符串常量池详细介绍
- 网页设计上机考试原题_计算机二级考试即将到达战场,各单位准备!!!!
- 我的第一份工作 (2007.2.28--2008.2.28) 上海三高计算机中心有限公司
- 数据库的方向 - 行vs列(转自: IBM i 中国开发团队)
- 支付宝将砸十亿支持中国女足发展:她们才是第一女子天团
- 学习ES6路线了解图
- 产品基础——认识竞品分析
- python 微服务 网关_关于API微服务网关
- 3D建模系统blender快捷键
- 【WINDOWS / DOS 批处理】添加注释
- [tensorflow] 多维矩阵的乘法
- maltab datenum函数与正则表达式巧用:逐日数据转为逐月数据、日序转月序
- linux段错误core dumped,段错误 (core dumped) 之 core文件
- 用户增长——CLV用户生命周期价值CLTV 笔记(一)
- CentOS 6.5 安装使用iscsi
- xe6 动态元素数量
- java gul,java gui 选择文件
- DDR(一)——基础理论
热门文章
- RxJava Map操作详解
- YTU 2553: 谁是赢家
- 2. mysql 基本命令
- 常用HTML转义字符,
- 2009年统考计算机考研真题
- 入门到 精通 JavaScript中的正则表达式RE、RegExp
- bootstrap-table初始化配置
- clipse和IDEA快捷键对照表
- ElasticSearch出现Cluster state has not been recovered yet, cannot write to the [null] index的解决办法
- .Net MVC中SelectList绑定默认值失效的解决办法