MATLAB--数字图像处理 Hough变换

前言

Hough变换是1962年由Hough提出来的,用于检测图像中直线、圆、抛物线、椭圆等形状能够用一定函数关系描述的曲线。
在这里我们重点研究的是利用Hough变换检测图中的直线。

Hough变换原理之基础一

在这里插入图片描述

对于上图中的直线L,用常规方程表示
L: y=ax+b
那么用极坐标怎么表示呢?
对于任意的R,都有
R×cos(β-θ)=ρ
展开得
R×cosβcosθ+R×sinβsinθ=ρ
又x=R×cosβ y=R×sinβ(这个就不用解释了吧 高中知识了 O(∩_∩)O)
x×cosθ+y×sinθ=ρ
从这个极坐标表示的式子来看,是不是在一条直线上面所有的(x,y)都对应一个ρ、θ呢?
所以这个就是hough变换的:点-线对偶性
通俗的讲:在直角坐标系中的一条直线,在极坐标下,其实就是一个点,坐标为(ρ,θ)

Hough变换原理之基础二

在这里插入图片描述

由a、b两图:位于一条直线上的两点,在极坐标会产生一个交点,说明他们共线。
可是在直角坐标系中明明只有两个点,b图中反而是两条曲线?


在这里插入图片描述

对于任意一点,过该点有无数条直线,每条直线都有一个(ρ,θ)值,那么无数条直线,就会组成连续的(ρ,θ)值,就会构成极坐标系下的一条连续曲线。

这样,我们对一副图像所有点进行同样的操作,得到一副(ρ,θ)图像。
如果我们需要找出图像中最长的那条直线,那么肯定组成该直线的点最多,那么在极坐标系中肯定有个(ρ,θ)点是有最多条直线相交得到的。

如下图,利用函数就可以找到相交曲线数最多的一个点。

在这里插入图片描述

那么找到该点有什么用呢?
找到该点,就可以得到(ρ,θ)值、直线起始、终止点坐标。(MATLAB提供函数支持)

Hough变换原理之基础三

这里来说说,计算机是怎么由(ρ,θ)坐标图找到相交曲线最多的那个点。
首先,提供一个坐标轴


在这里插入图片描述

这里就说简单些:在基础二我们可以得出一个点在极坐标系下的一条曲线
然后我们对该曲线进行细分,分成很多个点(得到坐标)
在第一步提供的坐标轴里面,凡是前面分出来的点坐标,该位置的值就累加1
重复所有点,就可以得出一副累加图
如果需要找到曲线相交最多那个点,就只需要在该坐标轴中找到值最大的点坐标即可。

Hough变换原理总结

  1. 极坐标与直角坐标系变换
  2. 得出每个点在极坐标系的曲线(或直线)
  3. 在极坐标系绘画出所有曲线,利用累加的方法寻找需要的点
  4. 找到该点,得出(ρ,θ)、直线的起始点、终点坐标

利用Hought变换寻找图像中的最长直线

 I = imread('k3.png'); 
I=rgb2gray(I);
figure; 
subplot(131), imshow(I); 

% Rotate the image
rotI = I;

% Create a binary image
BW = edge(rotI, 'canny'); 
subplot(133), imshow(BW); 

% Create the hough transform using the binary image 
[H, T, R] = hough(BW); 
figure, imshow(H, [], 'XData', T, 'YData', R, 'InitialMagnification', 'fit'); 
xlabel('\theta'), ylabel('\rho'); 
axis on, axis normal, hold on;
colormap(gca, hot);

% Find peaks in the hough transform of the image
P = houghpeaks(H, 1); 
x = T(P(:,2));
y = R(P(:,1)); 
plot(x, y, 's', 'color', 'blue'); 

% Find lines and plot them
lines = houghlines(BW, T, R, P, 'FillGap', 5, 'MinLength', 7); 
figure, imshow(rotI), hold on; 
max_len = 0; 
for k = 1 : length(lines)  % here length(lines)=12
   xy = [lines(k).point1; lines(k).point2];    
   % Determine the endpoints of the longest line segment
   len = norm(lines(k).point1 - lines(k).point2); % distance between point1 and point2
   if ( len > max_len )
      max_len = len; 
      xy_long = xy; 
xy = [lines(k).point1; lines(k).point2]; 
   end
end
 plot(xy(:, 1), xy(:, 2), 'LineWidth', 2, 'Color', 'green');

   % Plot beginnings and ends of lines
   plot(xy(1,1), xy(1,2), 'x', 'LineWidth', 2, 'Color', 'yellow');
   plot(xy(2,1), xy(2,2), 'x', 'LineWidth', 2, 'Color', 'red'); 

结果

在这里插入图片描述

haihong.png

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355