Consider this as a beginner’s tutorial to Matlab image processing. Read the documentation of the commands used and try and understand what they are doing and why.
1. Read the image
Use imread
to read the image into a 3D matrix. For convenience, we convert it to double
in the range [0..1] using im2double
:
>> img = im2double( imread( 'path/to/battety.jpg' ) );
You can check out the size of your img
using size
command:
>> size( img )
ans =
1024 768 3
You can see from the result that your image has 1024 rows, 768 columns and 3 channels (Red, Green and Blue).
2. Convert to black and white (a.k.a thresholding)
As you can see the battery is significantly brighter than the background and is colorless. We can select pixels that have large gap between the brightest channel value to darkest channel values as “battery” pixels:
>> bw = (max(img,[],3)-min(img,[],3)) > 0.2;
See max
and min
for more details.
There are other methods to threshold an image, see graythresh
for more details.
Using imshow
we can see what we got:
>> imshow(bw,[],'border','tight');
Normally one uses morphological operations to improve thresholding results.
You can use imclose
:
>> bw = imclose( bw, ones(25) );
Resulting with:
3. find angle of rotation
A very useful command for processing and working with bw images is regionprops
. It allows you to get all sorts of nice properties. You are going to use it to compute the 'Orientation'
of the “white”/battery region of your image
>> st = regionprops( bw, 'Orientation' )
st =
Orientation: 52.8694
As you can see the battery is rotated by 52.8 degrees.
Using imrotate
to “straighten” the battery
>> rbw = imrotate( bw, -st.Orientation );
Once the battery is axis-aligned, you can “project” the white pixels onto the horizontal and vertical axes using any
:
>> pc = any( rbw, 2 ); %// project all rows into a single column
>> pr = any( rbw, 1 ); %// project all columns into a single row
Now you need to find the first and last pixels set to 1 in the projections. Use find
for that:
>> fx = find( pr, 1, 'first'); %// first x coordinate
>> tx = find( pr, 1, 'last'); %// last x coordinat
>> fy = find( pc, 1, 'first'); %// first y coordinate
>> ty = find( pc, 1, 'last'); %// last y coordinate
Once you have x,y coordinates of corners, you can plot them on the rotated image:
>> imshow(rbw,[],'border','tight');
>> hold on;
>> plot( [fx tx tx fx fx], [fy fy ty ty fy], ':r', 'LineWidth',3);
Yields:
And the coordinates are:
>> [fx fy tx ty]
ans =
406 608 866 733
As you can see your battery is (866-406) pixels long and (733-608) pixels wide.
0
solved How can I detect the dimensions of an object under an angle in this picture in MATLAB? [closed]