Implementing ridge detection

后端 未结 3 1716
说谎
说谎 2021-02-06 08:23

I\'m trying to write a ridge detection algorithm, and all of the sources I\'ve found seem to conflate edge detection with ridge detection. Right now, I\'ve implemented the Canny

3条回答
  •  心在旅途
    2021-02-06 09:04

    I was going to suggest cleaning up your lines like Ian said, but if you don't want to do that, you might also look into doing some variant of a hough transform.

    http://en.wikipedia.org/wiki/Hough_transform

    You should be able to get the actual equation for the line from this, so you can make it as thin or as thick as you like. The only tricky part is figuring out where the line ends.

    Here's the code I wrote for a hough transform a few years ago, written in MATLAB. I'm not sure how well it works anymore, but it should give you a general idea. It will find all the lines (not segments) in an image

    im = imread('cube.tif');
    [bin1,bin2,bin3] = canny(im);
    
    %% define constants
    binary = bin1;
    distStep = 10; % in pixels
    angStep = 6; % in degrees
    thresh = 50;
    
    %% vote
    maxDist = sqrt((size(binary,1))^2+(size(binary,2))^2);
    angLoop = 0:angStep*pi/180:pi;
    origin = size(binary)/2;
    accum = zeros(ceil(maxDist/distStep)+1,ceil(360/angStep)+1);
    
    for y=1:size(binary,2)
        for x=1:size(binary,1)
        if binary(x,y)
            for t = angLoop
            dx = x-origin(1);
            dy = y-origin(2);
            r = x*cos(t)+y*sin(t);
            if r < 0
                r = -r;
                t = t + pi;
            end
            ri = round(r/distStep)+1;
            ti = round(t*180/pi/angStep)+1;
            accum(ri,ti) = accum(ri,ti)+1;
            end
        end
        end
    end
    imagesc(accum);
    
    %% find local maxima in accumulator
    accumThresh = accum - thresh;
    accumThresh(logical(accumThresh<0)) = 0;
    accumMax = imregionalmax(accumThresh);
    imagesc(accumMax);
    
    %% calculate radius & angle of lines
    dist = [];
    ang = [];
    for t=1:size(accumMax,2)
        for r=1:size(accumMax,1)
        if accumMax(r,t)
            ang = [ang;(t-1)*angStep/180*pi];
            dist = [dist;(r-1)*distStep];
        end
        end
    end
    scatter(ang,dist);
    

提交回复
热议问题