A lot of image processing algorithms rely on the convolution between a kernel (typicaly a 3x3 or 5x5 matrix) and an image. This may sound scary to some of you but that's not as difficult as it sounds:
Let's take a 3x3 matrix as our kernel. For each pixel, the filter multiplies the current pixel value and the other 8 surrounding pixels by the kernel corresponding value. Then it adds the result to get the value of the current pixel. Let's see an example:
In this example, the value of each pixel is equal to the double of the pixel that was located above it (e.g. 92 = 46 x 2).
A simple blur can be done using this kernel:
This is called the Box Blur. Each pixel is computed as the average of the surrounding pixels.
And here is the kernel for the Gaussian Blur:
As you can see, it's a weighted mean of the surrounding pixels that gives more weight to the pixel near the current pixel. This kind of filter is also called a low-pass filter.
The details of an image can be emphasized by using a high-pass filter:
In this kernel, the pixel is boosted when the neighbor pixels are different.
This filter can also be improved by applying the transformation only when the pixel is dark enough.
Another approach, called unsharp mask, consist in substracting from the original image a mask created using a low-pass filter. Basically, sharpening is realized by removed the blurry part of the image:
There are multiple ways to do edge detection. We will present the Sobel Operator here.
The Sobel Operator uses two kernels (one for each direction): and .
We compute the convolution between the image (converted in black and white) and the two kernels separately. That gives us, for each pixel, the values and . The value of the current pixel is set at .