function [ outputImg ] = isolatePlate( inputImg ) % ISOLATEPLATE Draw a box around a license plate in the input image % More info. % Params %SIZE_THRESHOLD = 60; TRUE = 1; FALSE = 0; % Show the original inputImg = im2double( inputImg ); figure, imshow( inputImg ), title( 'Original Image' ); %%%%% Image Prep % Convert To Grayscale Using the NTSC standard red = immultiply( inputImg(:,:,1), 299 ); green = immultiply( inputImg(:,:,2), 587 ); blue = immultiply( inputImg(:,:,3), 114 ); newImg = red + green + blue; newImg = imdivide( newImg, 1000 ); figure, imshow( newImg ), title( 'Grayscale Image' ); % Find the center of the red data, to find the column that the license % plate should cross scaledRed = mat2gray( red ); scaledBlue = mat2gray( blue ); scaledGreen = mat2gray( green ); redMap = scaledRed > 0.30 & scaledGreen < 0.40 & scaledBlue < 0.40; se = strel( 'disk', 5 ); redMap = imclose( redMap, se ); [row,column] = find( redMap ); redColumn = sum( column ) / size( column, 1 ); redRow = sum( row ) / size( row, 1 ); figure, imshow( imcomplement( redMap ) ), title( 'Red Map' ); rectangle( 'Position', [ redColumn 1 1 size( red, 1 ) ] ); rectangle( 'Position', [ 0 redRow size( red, 2 ) 1 ] ); %%%%% Vertical Edge Detection % Create our mask - a Sobel for vertical edge detection mask = fspecial( 'sobel' ); mask = rot90( mask, 1 ); % Do the actual detection edges = imfilter( newImg, mask ); % Show what we have so far figure, imshow( edges ), title( 'Vertical Edges' ); %%%%% Edge Density Map Generation % Create our mask of ones to add up the edge values densityMask = ones( 3, 15 ); % Sum it up edgeMap = imfilter( edges, densityMask ); edgeMap = imdivide( edgeMap, 45 ); % Show what we have so far figure, imshow( edgeMap ), title( 'Edge Map' ); %%%%% Binarization / Clean Up / Dilation % Binarize!!!! Use Otsu's Method. It's fast. level = graythresh( edgeMap ); binary = im2bw( edgeMap, level ); % Show what we have so far figure, imshow( binary ), title( 'Binarized Edge Map' ); % Clean Up by getting rid of small horizontal lines %se = strel( 'disk', 1 ); %cleanImage = imopen( binary, se ); % Show what we have so far %figure, imshow( cleanImage ), title( 'Cleaned Image' ); cleanImage = binary; % skipping the clean up step...don't seem to need it % Dilate the Image se = ones( 1, 9 ); dilated = imdilate( cleanImage, se ); % Show what we have so far figure, imshow( dilated ), title( 'Dilated Image' ); %%%%% License Plate Location % find all the 8-connected regions in the dilated binary image [labeled, num] = bwlabel( dilated ); figure, imshow( imcomplement( inputImg ) ), title( 'Original Image - All Connected Regions' ); % Feature Extraction info = []; for k = 1:1:num [row,column] = find( labeled == k ); topLeftRow = min( row ); topLeftColumn = min( column ); bottomRightRow = max( row ); bottomRightColumn = max( column ); numPixels = size( row, 1 ); width = bottomRightColumn - topLeftColumn; height = bottomRightRow - topLeftRow; newRow = [ topLeftRow topLeftColumn bottomRightRow bottomRightColumn numPixels width height ]; rectangle( 'Position', [ min( column ) min( row ) width + 1 height + 1 ] ); info = cat( 1, info, newRow ); end info % Combination of Candidate Regions figure, imshow( imcomplement( inputImg ) ), title( 'Original Image - Regions To Connect' ); densityV = []; for oneIndex = 1:1:size( info, 1 ) for twoIndex = (oneIndex + 1):1:size( info, 1 ) oneInfo = info( oneIndex, : ); twoInfo = info( twoIndex, : ); % Check whether they're overlapping overlap = TRUE; case1 = oneInfo( 1 ) + oneInfo( 7 ) < twoInfo( 1 ); case2 = oneInfo( 1 ) > twoInfo( 1 ) + twoInfo( 7 ); case3 = oneInfo( 2 ) + oneInfo( 6 ) < twoInfo( 2 ); case4 = oneInfo( 2 ) > twoInfo( 2 ) + twoInfo( 6 ); if case1 overlap = FALSE; elseif case2 overlap = FALSE; elseif case3 overlap = FALSE; elseif case4 overlap = FALSE; else overlap = TRUE; end % If they overlap, check their connected density if overlap topRow = min( oneInfo( 1 ), twoInfo( 1 ) ); insideTop = max( oneInfo( 1 ), twoInfo( 1 ) ); insideBottom = min( oneInfo( 3 ), twoInfo( 3 ) ); bottomRow = max( oneInfo( 3 ), twoInfo( 3 ) ); overlap = ( bottomRow - topRow + 1 ) - ( bottomRow - insideBottom ) - ( insideTop - topRow ); leftColumn = min( oneInfo( 2 ), twoInfo( 2 ) ); insideLeft = max( oneInfo( 2 ), twoInfo( 2 ) ); insideRight = min( oneInfo( 4 ), twoInfo( 4 ) ); rightColumn = max( oneInfo( 4 ), twoInfo( 4 ) ); dis = ( rightColumn - leftColumn + 1 ) - ( insideLeft - leftColumn ) - ( rightColumn - insideRight ); minH = min( oneInfo( 7 ), twoInfo( 7 ) ); sqr = sqrt( oneInfo( 6 ) * twoInfo( 6 ) ); density = ( overlap / minH ) - ( dis / sqr ); if ( density < 1.0 ) rectangle( 'Position', [ oneInfo( 2 ) oneInfo( 1 ) oneInfo( 6 ) oneInfo( 7 ) ] ); rectangle( 'Position', [ twoInfo( 2 ) twoInfo( 1 ) twoInfo( 6 ) twoInfo( 7 ) ] ); end densityV = cat( 1, densityV, density ); end end end densityV max( densityV ) min( densityV ) % Show what we have so far figure, imshow( labeled ), title( 'Regions of Binary Image' ); % create final image % final = zeros( size( inv, 1 ), size( inv, 2 ) ); % for k = 1:1:size( iregions ) % final = final | ( labeled == iregions( k ) ); % end % now return the processed image... outputImg = inputImg;