Goal
In this tutorial you will learn how to:
- Access pixel values
- Initialize a matrix with zeros
- Learn what saturate_cast does and why it is useful
- Get some cool info about pixel transformations
Theory
Note
The explanation below belongs to the book Computer Vision: Algorithms and Applications by Richard Szeliski
Image Processing
- A general image processing operator is a function that takes one or more input images and produces an output image.
- Image transforms can be seen as:
- Point operators (pixel transforms)
- Neighborhood (area-based) operators
Pixel Transforms
- In this kind of image processing transform, each output pixel’s value depends on only the corresponding input pixel value (plus, potentially, some globally collected information or parameters).
- Examples of such operators include brightness and contrast adjustments as well as color correction and transformations.
Brightness and contrast adjustments
- Two commonly used point processes are multiplication and addition with a constant:
- The parameters
and
are often called the gain and bias parameters; sometimes these parameters are said to control contrast andbrightness respectively.
- You can think of
as the source image pixels and
as the output image pixels. Then, more conveniently we can write the expression as:
whereand
indicates that the pixel is located in the i-th row and j-th column.
Code
- The following code performs the operation
:
Explanation
- We begin by creating parameters to save
and
to be entered by the user:
- We load an image using imread and save it in a Mat object:
- Now, since we will make some transformations to this image, we need a new Mat object to store it. Also, we want this to have the following features:
- Initial pixel values equal to zero
- Same size and type as the original image
We observe that Mat::zeros returns a Matlab-style zero initializer based on image.size() and image.type() - Now, to perform the operation
we will access to each pixel in image. Since we are operating with BGR images, we will have three values per pixel (B, G and R), so we will also access them separately. Here is the piece of code:
Notice the following:- To access each pixel in the images we are using this syntax: image.at<Vec3b>(y,x)[c] where y is the row, x is the column and c is R, G or B (0, 1 or 2).
- Since the operation
can give values out of range or not integers (if
is float), we use saturate_cast to make sure the values are valid.
- Finally, we create windows and show the images, the usual way.
No comments:
Post a Comment