Main Content

Detect Lines Using Radon Transform

This example shows how to use the Radon transform to detect lines in an image. The Radon transform is closely related to a common computer vision operation known as the Hough transform. You can use the radon function to implement a form of the Hough transform used to detect straight lines.

Compute the Radon Transform of an Image

Read an image into the workspace. Convert it into a grayscale image.

I = fitsread("solarspectra.fts");
I = rescale(I);

Display the original image.

figure
imshow(I)
title("Original Image")

Figure contains an axes object. The axes object with title Original Image contains an object of type image.

Compute a binary edge image using the edge function. Display the binary image returned by the edge function.

BW = edge(I);
figure
imshow(BW)
title("Edges of Original Image")

Figure contains an axes object. The axes object with title Edges of Original Image contains an object of type image.

Calculate the Radon transform of the image, using the radon function. The locations of peaks in the transform correspond to the locations of straight lines in the original image.

theta = 0:179;
[R,xp] = radon(BW,theta);

Display the result of the Radon transform.

figure
imagesc(theta,xp,R)
colormap(hot)
xlabel("\theta (degrees)")
ylabel("x^{\prime} (pixels from center)")
title("R_{\theta} (x^{\prime})")
colorbar

Figure contains an axes object. The axes object with title R indexOf theta baseline blank ( x toThePowerOf prime baseline ) contains an object of type image.

Interpret the Peaks of the Radon Transform

Calculate the θ and x' offset values for the five largest peaks. The xp_peak_offset values represent the offset of the peak from the center of the image, in pixels.

R_sort = sort(unique(R),"descend");

[row_peak,col_peak] = find(ismember(R,R_sort(1:5)));
xp_peak_offset = xp(row_peak);
theta_peak = theta(col_peak);

Add an x marker at the center of the original image. The row indices of an image map to the y-direction, and the columns map to the x-direction, so calculate centerX as half the number of columns and centerY as half the number of rows in the image I.

centerX = ceil(size(I,2)/2);
centerY = ceil(size(I,1)/2);

figure
imshow(I)
hold on
scatter(centerX,centerY,50,"bx",LineWidth=2)

Figure contains an axes object. The axes object contains 2 objects of type image, scatter.

There are three strong peaks with θ = 1 degree and offsets of –80, –84, and –87 pixels from center. Plot the radial line that passes through the center at an angle of θ = 1 degree as a red dashed line. Represent the Radon as solid red lines that are perpendicular to the dashed line, and shifted –80, –84, and –87 pixels from the center, which positions them to the left.

[x1,y1] = pol2cart(deg2rad(1),5000);
plot([centerX-x1 centerX+x1],[centerY+y1 centerY-y1],"r--",LineWidth=2)

[x91,y91] = pol2cart(deg2rad(91),100);
for i=1:3
    plot([centerX-x91+xp_peak_offset(i) centerX+x91+xp_peak_offset(i)], ...
        [centerY+y91 centerY-y91], ...
        "r",LineWidth=2)
end

Figure contains an axes object. The axes object contains 6 objects of type image, scatter, line.

There are also two strong peaks at θ = 91 degrees, with offsets of –8 and –44 pixels from center. Plot the radial line that passes through the center at an angle of θ = 91 degrees as a green dashed line. Represent the Radon peaks as solid green lines that are perpendicular to the dashed line, and shifted –8 and –44 pixels from center, which positions them down.

plot([centerX-x91 centerX+x91],[centerY+y91 centerY-y91],"g--",LineWidth=2)

for i=4:5
plot([centerX-x1 centerX+x1], ...
    [centerY+y1-xp_peak_offset(i) centerY-y1-xp_peak_offset(i)], ...
    "g",LineWidth=2)
end

Figure contains an axes object. The axes object contains 9 objects of type image, scatter, line.

See Also

| |

Related Topics