I am trying to \"translate\" what\'s mentioned in Gonzalez and Woods (2nd Edition) about the Laplacian filter.
I\'ve read in the image and created the filter. However, w
I have a few tips for you:
filter2
performs correlation. You actually need to perform convolution, which rotates the kernel by 180 degrees before performing the weighted sum between neighbourhoods of pixels and the kernel. However because the kernel is symmetric, convolution and correlation perform the same thing in this case. filter2
or conv2
and takes advantage of the Intel Integrated Performance Primitives. double
precision first, then convert back to uint8
when you're done. Use im2double to convert your image (most likely uint8
) to double
precision. When performing sharpening, this maintains precision and prematurely casting to uint8
then performing the subtraction will give you unintended side effects. uint8
will cap results that are negative or beyond 255 and this may also be a reason why you're not getting the right results. Therefore, convert the image to double
, filter the image, sharpen the result by subtracting the image with the filtered result (via the Laplacian) and then convert back to uint8
by im2uint8.You've also provided a link to the pipeline that you're trying to imitate: http://www.idlcoyote.com/ip_tips/sharpen.html
The differences between your code and the link are:
As such:
clc;
close all;
a = im2double(imread('moon.png')); %// Read in your image
lap = [-1 -1 -1; -1 8 -1; -1 -1 -1]; %// Change - Centre is now positive
resp = imfilter(a, lap, 'conv'); %// Change
%// Change - Normalize the response image
minR = min(resp(:));
maxR = max(resp(:));
resp = (resp - minR) / (maxR - minR);
%// Change - Adding to original image now
sharpened = a + resp;
%// Change - Normalize the sharpened result
minA = min(sharpened(:));
maxA = max(sharpened(:));
sharpened = (sharpened - minA) / (maxA - minA);
%// Change - Perform linear contrast enhancement
sharpened = imadjust(sharpened, [60/255 200/255], [0 1]);
figure;
subplot(1,3,1);imshow(a); title('Original image');
subplot(1,3,2);imshow(resp); title('Laplacian filtered image');
subplot(1,3,3);imshow(sharpened); title('Sharpened image');
I get this figure now... which seems to agree with the figures seen in the link: