Matlab实现Hough变换检测图像中的直线

Hough变换的原理:

将图像从图像空间变换至参数空间,变换公式如下:

变换以后,图像空间与参数空间存在以下关系:

图像空间中的一点在参数空间是一条曲线,而图像空间共线的各点对应于参数空间交于一点的各条曲线。

下面使用Matlab实现Hough变换对图像中的直线划痕进行检测。

close all;
clear all;
I  = imread('scratch.tif');
figure;
subplot(1,3,1);
imshow(I);
BW = edge(I,'canny');%Canny方法提取图像边界,返回二值图像(边界1,否则0)
[H,T,R] = hough(BW);%计算二值图像的标准霍夫变换,H为霍夫变换矩阵,I,R为计算霍夫变换的角度和半径值
subplot(1,3,2);
imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit');%hough变换的图像
xlabel('\theta'), ylabel('\rho');
axis on,axis square,hold on;
P  = houghpeaks(H,3);%提取3个极值点
x = T(P(:,2));
y = R(P(:,1));
plot(x,y,'s','color','white');%标出极值点
lines=houghlines(BW,T,R,P);%提取线段
subplot(1,3,3);
imshow(I), hold on;
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
 plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');%画出线段
plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');%起点
plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');%终点
end

Matlab实现Hough变换检测图像中的直线

时间: 2024-08-08 22:09:48

Matlab实现Hough变换检测图像中的直线的相关文章

Python下opencv使用笔记(十一)(详解hough变换检测直线与圆)

在数字图像中,往往存在着一些特殊形状的几何图形,像检测马路边一条直线,检测人眼的圆形等等,有时我们需要把这些特定图形检测出来,hough变换就是这样一种检测的工具. Hough变换的原理是将特定图形上的点变换到一组参数空间上,根据参数空间点的累计结果找到一个极大值对应的解,那么这个解就对应着要寻找的几何形状的参数(比如说直线,那么就会得到直线的斜率k与常熟b,圆就会得到圆心与半径等等). 关于hough变换,核心以及难点就是关于就是有原始空间到参数空间的变换上.以直线检测为例,假设有一条直线L,

Opencv图像识别从零到精通(22)-----hough变换检测直线与圆

今天要看的是霍夫变换,常用用来检测直线和圆,这里是把常见的笛卡尔坐标系转换成极坐标下,进行累计峰值的极大值,确定.HoughLines,HoughLinesP,HoughCircles,三个函数,首先先看看原理,最后会用漂亮的matlab图,来回归一下,霍夫直线变换. 霍夫线变换: 众所周知, 一条直线在图像二维空间可由两个变量表示. 例如: 在 笛卡尔坐标系: 可由参数:  斜率和截距表示. 在 极坐标系: 可由参数:  极径和极角表示 对于霍夫变换, 我们将用 极坐标系 来表示直线. 因此,

hough变换检测直线

hough变换检测直线原理: 假设在图像中存在一条直线y=k*x+b(此时k,b未知).取直线上的任意两点进行说明,设为(x0,y0),(x1,y1). 所有经过点(x0,y0)的直线满足:-x0*k+y0=b ---式1,那么以k.b为直角坐标轴做式1对应直线: 所有经过点(x1,y1)的直线满足:-x1*k+y1=b ---式2,那么以k.b为直角坐标轴做式2对应直线: 两直线交于一点(kk,bb),此时该交点对应的直线y=kk*x+bb就是(x0,y0),(x1,y1)所确定的直线. 在h

利用OpenCV检测图像中的长方形画布或纸张并提取图像内容

基于知乎上的一个答案.问题如下: 也就是在一张照片里,已知有个长方形的物体,但是经过了透视投影,已经不再是规则的长方形,那么如何提取这个图形里的内容呢?这是个很常见的场景,比如在博物馆里看到一幅很喜欢的画,用手机找了下来,可是回家一看歪歪斜斜,脑补原画内容又觉得不对,那么就需要算法辅助来从原图里提取原来的内容了.不妨把应用的场景分为以下: 纸张四角的坐标(图中红点)已知的情况 也就是上面的左图中4个红点是可以准确获取,比如手动标注,那么就简单了:用OpenCV的Perspective Trans

利用matlab提取并分割RGB图像中的某一个已知像素值的图像

已知一副RGB图像中的的像素值,利用matlab将其分割出来并以二进制图像形式显示: %extract.m clear all; I=imread('new_original.png'); figure,imshow(I),title('Original Image'); bw=im2bw(I,0.3); %figure,imshow(bw),title('Gray Image'); rgb=[252,2,4]; img=extract_rgb(I,rgb); figure,imshow(im2

Hough变换检测圆(附:MATLAB程序) - mhjerry的专栏(子水) - 博客频道 - CSDN.NET

来源:http://blog.csdn.net/mhjerry/article/details/7061819#1536434-hi-1-45330-42d97150898b1af15ddaae52f91f09c2 Hough变换很好玩,以前在学校写过一些检测圆圈.椭圆.双曲线等图像,同时也可以检测多个圆形.

Hough变换检测椭圆

 由椭圆的公式(1)可得,确定一个椭圆需要5个参数,a,b 为椭圆的长轴和段轴,P,Q 为椭圆中心坐标,θ为椭圆的旋转角度.如果用传统的Hough变换方法,参数空间需要五维.这种方法在计算过程中所耗费的时间和空间资源是惊人的,根本无法应用于实际.为此,人们提出了很多新的改进算法. 改进算法主要分为两种: 1)随机Hough变换(RHT),采用多到一的映射,但是随机采样会带来大量无效的计算,当点数很大时,算法的性能急剧下降. 2)利用椭圆的几何特征降低参数的维度. 本文所提出的椭圆检测方法也是基于

Python-Anaconda练习candy算子用于边缘提取,再用hough变换检测直线边缘

img: 待检测的图像. threshold: 阈值,可先项,默认为10 line_length: 检测的最短线条长度,默认为50 line_gap: 线条间的最大间隙.增大这个值可以合并破碎的线条.默认为10 返回: lines: 线条列表, 格式如((x0, y0), (x1, y0)),标明开始点和结束点. 下面,我们用canny算子提取边缘,然后检测哪些边缘是直线? import skimage.transform as st import matplotlib.pyplot as pl

OpenCV_检测图像中的条形码

看了StackOverflow上的这篇文章后,加以改进,基于C++实现 先上几张效果图: 算法的主要流程为: 1.首先将读入图片归一化到640*480大小以内的,图片太大的话,一是运行速度慢,而是影响检测效果: 2.将彩色图转换成灰度图: 3.得到灰度图分别在水平方向和垂直方向上的梯度幅值: 4.将水平方向上梯度幅值减去垂直方向上的梯度幅值,得到高水平梯度和低垂直梯度的图片: 效果为: 5.对这个图像进行平均模糊,有助于平滑梯度图像中的高频噪声: 平滑后的效果为: 6.二值化.将模糊化后的图像进