在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

检测提取图像中的直线(基于霍夫变换)相关推荐

  1. 图像分割实战之基于Hough变换提取图像中的直线

    图像分割的依据是基于图像中各区域具有不同的特性(比如,灰度.颜色.纹理).图像分割的目的是将图像划分成若干具有相近或相同特性的子区域,以便继续在分割成的相关区域中提取目标,并进而根据目标的特征或结构信 ...

  2. hough变换检测直线 matlab,Matlab实现Hough变换检测图像中的直线

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

  3. echarts怎么控制一个点沿着折线移动_计算机怎么识别图像中的直线?

    1 直线检测问题 在纸上画一条直线,用手机拍下照片,把照片交给计算机识别. 计算机是如何知道这张照片中的这条直线的? 存在直线吗? 直线在哪里? 点.线.面是基本的几何元素. 欧几里得在<几何原 ...

  4. 平行坐标系下采用CHT方法检测自然图像中的消失点(VanishingPoint)

    --------------------20210826更新-------------------- code和paper链接:https://pan.baidu.com/s/13RyRu0rg7Fh ...

  5. MATLAB#183;提取图像中多个目标

    基于matlab工具箱提取图像中的多目标特征(代码如下): 代码前面部分为提取图像的边界信息,调用了后面的遍历函数Pixel_Search,函数实现方法见后~ %%ROI Testing close ...

  6. MATLAB·提取图像中多个目标

    基于matlab工具箱提取图像中的多目标特征(代码如下): 代码前面部分为提取图像的边界信息,调用了后面的遍历函数Pixel_Search,函数实现方法见后~ %%ROI Testing close ...

  7. 使用Python,OpenCV+OCR检测护照图像中的机器可读区域(MRZ Machine-Readable Zones)

    使用Python,OpenCV+OCR检测护照图像中的机器可读区域(MRZ Machine-Readable Zones) 1. 效果图 2. 原理 3. 源码 参考 这篇博客将介绍如何只使用基本的图 ...

  8. 【论文党福利】如何提取图像中的数据

    [论文党福利]如何提取图像中的数据 从事科研的老师和同学们在撰写论文时,经常需要将文献中的曲线与自己的结果进行对比,为获取原始数据,最靠谱的方法当然是找原作者要.如果没有要到呢?本文将成为论文党的福利 ...

  9. 教你如何用Python检测出图像中的黄色?都在这里!

    首先,这里不搞黄色,只搞学习,希望大家好好学习,争取早日变成大佬,升职加薪.当上总经理.出任CEO.迎娶白富美.走上人生巅峰,想想是不是有点小激动. 等等,别跑偏了,接下来开始学习. 有时我们需要检测 ...

  10. Opencv学习笔记(二) 提取图像中的水平线和垂直线

    提取图像中的水平线和垂直线属于基础的形态学操作的应用,原理:根据要提取图形来定义一个特定的结构元素,然后以这个结构相素去遍历图像,进行一系列形态学操作,以此过滤掉其他特征的图形,达到提取的效果. 示例 ...

最新文章

  1. cad画流程图的插件_CAD制图太慢?62款辅助插件汇总,款款精品,效率提升80%
  2. matlab求被21整除,用matlab求[100,999]之间能被21整除的数的个数,还有建立一个字符串向量,删除大写字母._...
  3. Java中的字符串常量池详细介绍
  4. 网页设计上机考试原题_计算机二级考试即将到达战场,各单位准备!!!!
  5. 我的第一份工作 (2007.2.28--2008.2.28) 上海三高计算机中心有限公司
  6. 数据库的方向 - 行vs列(转自: IBM i 中国开发团队)
  7. 支付宝将砸十亿支持中国女足发展:她们才是第一女子天团
  8. 学习ES6路线了解图
  9. 产品基础——认识竞品分析
  10. python 微服务 网关_关于API微服务网关
  11. 3D建模系统blender快捷键
  12. 【WINDOWS / DOS 批处理】添加注释
  13. [tensorflow] 多维矩阵的乘法
  14. maltab datenum函数与正则表达式巧用:逐日数据转为逐月数据、日序转月序
  15. linux段错误core dumped,段错误 (core dumped) 之 core文件
  16. 用户增长——CLV用户生命周期价值CLTV 笔记(一)
  17. CentOS 6.5 安装使用iscsi
  18. xe6 动态元素数量
  19. java gul,java gui 选择文件
  20. DDR(一)——基础理论

热门文章

  1. RxJava Map操作详解
  2. YTU 2553: 谁是赢家
  3. 2. mysql 基本命令
  4. 常用HTML转义字符,
  5. 2009年统考计算机考研真题
  6. 入门到 精通 JavaScript中的正则表达式RE、RegExp
  7. bootstrap-table初始化配置
  8. clipse和IDEA快捷键对照表
  9. ElasticSearch出现Cluster state has not been recovered yet, cannot write to the [null] index的解决办法
  10. .Net MVC中SelectList绑定默认值失效的解决办法