Hough transform doesn't detect some lines
Show older comments
Hi, I tried using Hough transform to detect all the straight lines in an image below

so that only logic gates remain in the image. But Hough transform detect only some lines as shown in figure an the detected lines are colored in green.

Can someone please tell what could the reason. What is the best, robust function in matlab to detect lines in image that can work on any type of image. If Hough transform is the best available one, what can be done to increase its robustness to detect all straight lines that can be used in any type of image.The code used is below one where BW_ConnComp is a binary inverted image. The "lines" calculated is drawn in green.
img = edge(BW_ConnComp,'prewitt');
figure, imshow(img), hold on
[H,T,R] = hough(img);
P = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));
lines = houghlines(BW,T,R,P,'FillGap',5);
Answers (4)
Image Analyst
on 21 Mar 2015
0 votes
Try changing the threshold, or not calling edge() at all. Not sure why you called edge in the fist place. I mean it already has edges and calling edge just turns a single edge into a double edge - just look at your image and you'll see.
1 Comment
Jack Smith
on 21 Mar 2015
Edited: Jack Smith
on 22 Mar 2015
Image Analyst
on 22 Mar 2015
0 votes
Jack:
Try the attached code. Change your folder and image name before you run it.

2 Comments
Walter Roberson
on 20 Sep 2015
Jack Smith commented
I want to understand why Hough transform is unable to detect all the lines.
Image Analyst
on 20 Sep 2015
Jack, they were probably not selected due to the threshold level. Attach a specific example (code plus image) in a new question if you want more help.
sonia carole
on 2 Feb 2016
I = imread('SAM_0160.jpg');
I=imresize(I,[640 480]);
figure,imshow(I);
rotI =imrotate(I,33,'crop');
bw_I =rgb2gray(rotI);
BW = edge(bw_I,'canny');
figure; imshow(BW);
[H,T,R] = hough(BW);
imshow(H,[],'XData',T,'YData',R,...
'InitialMagnification','fit');
xlabel('\theta'), ylabel('\rho');
axis on, axis normal, hold on;
P = houghpeaks(H,5,'threshold',ceil(0.6*max(H(:))));
x = T(P(:,2)); y = R(P(:,1));
plot(x,y,'s','color','white');
% Find lines and plot them
lines = houghlines(BW,T,R,P,'FillGap',30,'MinLength',15);
figure, imshow(rotI), hold on
max_len = 0;
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
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');
% Determine the endpoints of the longest line segment
len = norm(lines(k).point1 - lines(k).point2);
if ( len > max_len)
max_len = len;
xy_long = xy;
end
end
% highlight the longest line segment %plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','blue');
3 Comments
sonia carole
on 2 Feb 2016
I am facing the same problem,I am not able to detect all the lines in my image, when I am changing both angle and threshold. thank you for your help. my intentions is to detect overhead power lines and then track them.
Spencer Glubay
on 17 Oct 2020
I think your min length is too high or you are don't have enough number of peaks. Both of these will reduce how many lines are displayed in the end.
Image Analyst
on 17 Oct 2020
Try taking the radon transform and see if you can see peaks at the expected angles.
Satadru Mukherjee
on 21 Jul 2020
Simple Code , no need Hough--
clc
clear all
close all
warning off
x=imbinarize(rgb2gray(imread('Capture.JPG')));
imshow(x);
impixelinfo;
[r c]=size(x);
l=zeros(r,c);
se=strel('line',60,0);
imshow(x);
l=l+imopen(x,se);
imshow(l);
se=strel('line',60,90);
imshow(x);
l=l+imopen(x,se);
imshow(l);
Categories
Find more on Hough Transform in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!