Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
244 views
in Technique[技术] by (71.8m points)

python - Is Laplacian of Gaussian for blob detection or for edge detection?

The following code is provided from (was asked to remove the link). But I was wondering how it exactly works. I was confused if this was considered edge detection or blob detection, as Wikipedia list the Laplacian of Gaussian (LoG) as blob detection.

Also, could somebody explain and provide a deeper explanation for why the absolute value is calculated and what is going on in the focus_stack() function?

#   Compute the gradient map of the image
def doLap(image):

    # YOU SHOULD TUNE THESE VALUES TO SUIT YOUR NEEDS
    kernel_size = 5         # Size of the laplacian window
    blur_size = 5           # How big of a kernal to use for the gaussian blur
                            # Generally, keeping these two values the same or very close works well
                            # Also, odd numbers, please...

    blurred = cv2.GaussianBlur(image, (blur_size,blur_size), 0)
    return cv2.Laplacian(blurred, cv2.CV_64F, ksize=kernel_size)

#
#   This routine finds the points of best focus in all images and produces a merged result...
#
def focus_stack(unimages):
    images = align_images(unimages)

    print "Computing the laplacian of the blurred images"
    laps = []
    for i in range(len(images)):
        print "Lap {}".format(i)
        laps.append(doLap(cv2.cvtColor(images[i],cv2.COLOR_BGR2GRAY)))

    laps = np.asarray(laps)
    print "Shape of array of laplacians = {}".format(laps.shape)

    output = np.zeros(shape=images[0].shape, dtype=images[0].dtype)

    abs_laps = np.absolute(laps)
    maxima = abs_laps.max(axis=0)
    bool_mask = abs_laps == maxima
    mask = bool_mask.astype(np.uint8)
    for i in range(0,len(images)):
        output = cv2.bitwise_not(images[i],output, mask=mask[i])

    return 255-output
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

hkchengrex's answer is fairly complete, but I don't completely agree. Maybe I'm a bit of a stickler for correct nomenclature. A detector is something that yields a strong response at the location of the thing to be detected.

The Laplacian of Gaussian (LoG) is not an edge detector, since it has zero crossings at (near*) edges. But it can be used to construct an edge detector. The edge detector so constructed is the Marr-Hildreth edge detector. Because of this, it often gets classified under edge detectors. To me, it's a line detector.

The Laplace is the sum of second derivatives (the trace of the Hessian matrix). An image convolved with the LoG is the same as the Laplacian of an image convolved with a Gaussian:

img * [ d^2/dx^2 G(x,y) + d^2/dy^2 G(x,y) ] = d^2/dx^2 [ img * G(x,y) ] + d^2/dy^2 [ img * G(x,y) ]

Thus, the LoG yields a strong response at extrema in the image (where the second derivative is maximal). This happens at the peaks of "blobs", and along the ridges of lines.

Let's take this simple test image:

image with blocks, lines and dots

and apply the LoG to it:

LoG of image above

Here, mid-gray are pixels with a value of 0. As can be seen, it has strong (negative) response along the thin line and on the small dots. It also has medium responses around the edges of the wider objects (negative inside the edge, positive outside); the zero crossings are close to where the edges are.

We can threshold this image to detect the thin line and the dots:

LoG < 65

(thresholding the magnitude yields the same result). We can lower the threshold to see that medium responses happen around edges of interest:

abs(LoG) < 20

It takes more than a simple threshold to obtain edges. In contrast, the gradient magnitude (first derivatives are strong at the location of edges) can be thresholded to obtain edges:

gradmag < 50

The gradient magnitude is not useful to detect lines, as it detects the two edges along the lines, rather than the line itself. The gradient magnitude above is computed using Gaussian derivatives (Sobel is another option, but not as precise).

Note that the Canny edge detector is based on the gradient magnitude, it adds non-maximum suppression and hysteresis thresholding to make the detections thin and meaningful.


* The second derivative has a zero crossing at the inflection points (which can be taken as the true location of edges). However, the Laplacian is the sum of second derivatives. If you think of the second derivative in the direction of the gradient, its zero crossing will be well localized. But now add the second derivative in the perpendicular direction (along the edge). This second derivative will be zero along a straight edge, negative along a convex curved edge (e.g. the edge of a circle), and positive along a concave curved edge. Adding these two values will therefore cause the zero crossings to shift on curved edges, the stronger the curvature, the more the zero crossing will deviate from its true location.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...