# # Image processing

## # Basic image I/O

```
>> img = imread('football.jpg');
```

Use `imread`

to read image files into a matrix in MATLAB.

Once you `imread`

an image, it is stored as an ND-array in memory:

```
>> size(img)
ans =
256 320 3
```

The image `'football.jpg'`

has 256 rows and 320 columns and it has 3 color channels: Red, Green and Blue.

You can now mirror it:

```
>> mirrored = img(:, end:-1:1, :); %// like mirroring any ND-array in Matlab
```

And finally, write it back as an image using `imwrite`

:

```
>> imwrite(mirrored, 'mirrored_football.jpg');
```

## # Retrieve Images from the Internet

As long as you have an internet connection, you can read images from an hyperlink

```
I=imread('https://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-logo.png');
```

## # Filtering Using a 2D FFT

Like for 1D signals, it's possible to filter images by applying a Fourier transformation, multiplying with a filter in the frequency domain, and transforming back into the space domain. Here is how you can apply high- or low-pass filters to an image with Matlab:

Let `image`

be the original, unfiltered image, here's how to compute its 2D FFT:

```
ft = fftshift(fft2(image));
```

Now to exclude a part of the spectrum, one need to set its pixel values to 0. The spatial frequency contained in the original image is mapped from the center to the edges (after using `fftshift`

). To exclude the low frequencies, we will set the central circular area to 0.

Here's how to generate a disc-shaped binary mask with radius `D`

using built-in function:

```
[x y ~] = size(ft);
D = 20;
mask = fspecial('disk', D) == 0;
mask = imresize(padarray(mask, [floor((x/2)-D) floor((y/2)-D)], 1, 'both'), [x y]);
```

Masking the frequency domain image can be done by multiplying the FFT point-wise with the binary mask obtained above:

```
masked_ft = ft .* mask;
```

Now, let's compute the inverse FFT:

```
filtered_image = ifft2(ifftshift(masked_ft), 'symmetric');
```

The high frequencies in an image are the sharp edges, so this high-pass filter can be used to sharpen images.

## # Image Filtering

Let's say you have an image `rgbImg`

, e.g., read in using `imread`

.

```
>> rgbImg = imread('pears.png');
>> figure, imshow(rgbImg), title('Original Image')
```

Use `fspecial`

to create a 2D filter:

```
>> h = fspecial('disk', 7);
>> figure, imshow(h, []), title('Filter')
```

Use `imfilter`

to apply the filter on the image:

```
>> filteredRgbImg = imfilter(rgbImg, h);
>> figure, imshow(filteredRgbImg), title('Filtered Image')
```

## # Measuring Properties of Connected Regions

Starting with a binary image, `bwImg`

, which contains a number of connected objects.

```
>> bwImg = imread('blobs.png');
>> figure, imshow(bwImg), title('Binary Image')
```

To measure properties (e.g., area, centroid, etc) of every object in the image, use `regionprops`

:

```
>> stats = regionprops(bwImg, 'Area', 'Centroid');
```

`stats`

is a struct array which contains a struct for every object in the image. Accessing a measured property of an object is simple. For example, to display the area of the first object, simply,

```
>> stats(1).Area
ans =
35
```

Visualize the object centroids by overlaying them on the original image.

```
>> figure, imshow(bwImg), title('Binary Image With Centroids Overlaid')
>> hold on
>> for i = 1:size(stats)
scatter(stats(i).Centroid(1), stats(i).Centroid(2), 'filled');
end
```