Here's the example image:
Octave has plenty of image processing functions in the
image
package from Octave Forge. Here's the edges detected with the built-in edge()
function:Now we need to perform a smart correlation with the gauge needles so we can map the angle of the needle to a decimal value in [0,10). One way to do it would be to zoom in on the center of the gauge:
Then we can perform a simple least squares regression on the non-zero pixel locations to get a rough estimate of the "slope" of the needle.
needleI = pngread( "needle.png" );
[i,j] = find(needleI(1:35,1:35));
y = 40-j;
x = i;
X = [ ones(length(x),1), x ];
A = X'*X;
b = (X')*y;
beta = A\b;
For the first needle pictured above we get a slope of -0.19643. This seems a tad low, so we probably need to correct for the slant in the original image.
Octave script with all the calculations demonstrated above.
Also check out this book or this page for lots of image processing examples in MATLAB/Octave.
One of the other commenters at slashdot found this example using Matlab too. A little bit different, there's only one gauge in the picture, so he can apply a transform to the entire image to find the longest line (the needle), and then map that into the gauge reading.
ReplyDelete