% countgrid - Function to clean up a text image and estimate text size % - Part of setUpCmatscii.m % Usage: % [textpic2,estimation]=countgrid(textpic,textSpaceSizeWH) % % Arguments: % textpic - 2D array of image containing chinese characters % the characters must be arranged in grid % [Optional] % textSpaceSizeWH - text width and height in pixel (if 1 element) % - [textWidth textHeight] (if 2 elements) % - [textWidth textHeight HSpace VSpace] (if 4 elements) % - if not supplied, all four parameters will be estimated % % Output: % textpic2 - cropped input image, leaving out white border % estimation - data structure containing % estimated textsize, spacesize, and estimation data % % Author: % Tzu Yen Wong % wongt AT csse DOT uwa DOT edu DOT au % Department of Computer Science & Software Engineering % The University of Western Australia % % Created: Mar 2004 % Revised: Apr 2004 %1234567890123456789012345678901234567890123456789012345678901234567890123456789 function [textpic2,estimation]=countgrid(textpic,textSpaceSizeWH) % textwidth = 11; margin = 1; % number of pixal to leave blank eval('textSpaceSizeWH;','textSpaceSizeWH=[];') %MMMMMM estimating text size MMMMMM if ndims(textpic) == 3 % colour image textpic = double(textpic); textpic = (textpic(:,:,1) + textpic(:,:,2) + textpic(:,:,2))/3; % Grey value = (R+G+B)/3 end textWhiteOnBlack = (textpic==0); sumColDown = sum(textWhiteOnBlack,1); sumRowRight = sum(textWhiteOnBlack,2); MS_H = countMarkSpace(sumColDown); MS_V = countMarkSpace(sumRowRight); [textSizeH,freqH] = estimateMS(MS_H); [textSizeV,freqV] = estimateMS(MS_V); HtextSize_freq = [textSizeH;freqH]; VtextSize_freq = [textSizeV;freqV]; textWidthEst = max(textSizeH(1:2)); HSpaceEst = min(textSizeH(1:2)); textHeightEst = max(textSizeV(1:2)); VSpaceEst = min(textSizeV(1:2)); %MMMMMM End estimating text size MMMMMM if ~isempty(textSpaceSizeWH), if length(textSpaceSizeWH)==1, textWidthEst = textSpaceSizeWH; textHeightEst = textSpaceSizeWH; elseif length(textSpaceSizeWH)>=2, textWidthEst = textSpaceSizeWH(1); textHeightEst = textSpaceSizeWH(2); if length(textSpaceSizeWH)==4, HSpaceEst = textSpaceSizeWH(3); VSpaceEst = textSpaceSizeWH(4); else warning('invalid textSpaceSizeWH???'); end end end % Display on screen disp(sprintf(' ')) disp(sprintf(' Text width estimated = %d pixels.',textWidthEst)) disp(sprintf(' Horizontal space = %d pixels.',HSpaceEst)) disp(sprintf(' Text Height estimated = %d pixels.',textHeightEst)) disp(sprintf(' Vertical space = %d pixels.\n',VSpaceEst)) % Cropping out white spaces textpic = (textpic~=0); % make it logical to save memory textpic2 = textpic(... MS_V(1)-textHeightEst+MS_V(2)+1-margin : sum(MS_V)-MS_V(end)+margin ,... MS_H(1)-textWidthEst +MS_H(2)+1-margin : sum(MS_H)-MS_H(end)+margin); MS_V(1)=1; MS_V(end)=1; MS_H(1)=1; MS_H(end)=1; [nrow,ncol]=size(textpic2); numCharV = (nrow+VSpaceEst-2*margin)/(textHeightEst+VSpaceEst); numCharH = (ncol+HSpaceEst-2*margin)/(textWidthEst +HSpaceEst); if numCharV~=fix(numCharV) || numCharH~=fix(numCharH), numCharV=ceil(numCharV); numCharH=ceil(numCharH); textpic3 = zeros(numCharV*(textHeightEst+VSpaceEst)-VSpaceEst+2*margin,... numCharH*(textWidthEst +HSpaceEst)-HSpaceEst+2*margin)==0; textpic3(1:nrow,1:ncol) = textpic2; textpic2=textpic3; warning('irregular textsize???') % textpic2 = textpic2(... % 1:numCharV*(textHeightEst+VSpaceEst)-VSpaceEst+2*margin,... % 1:numCharH*(textWidthEst +HSpaceEst)-HSpaceEst+2*margin); end % double check!!!! [nrow,ncol]=size(textpic2); numCharV = (nrow+VSpaceEst-2*margin)/(textHeightEst+VSpaceEst); numCharH = (ncol+HSpaceEst-2*margin)/(textWidthEst +HSpaceEst); if numCharV~=fix(numCharV) || numCharH~=fix(numCharH), warning('problems!!!') end % end double check!!!! % Display on screen disp(sprintf(' %d characters vertically.%n',numCharV)) disp(sprintf(' %d characters horizontally.%n',numCharH)) % compositing estimation structure for data passing estimation = cell(7,1); estimation{1}{1} = textWidthEst; estimation{1}{2} = 'textWidthEst'; estimation{2}{1} = textHeightEst; estimation{2}{2} = 'textHeightEst'; estimation{3}{1} = HSpaceEst; estimation{3}{2} = 'HSpaceEst'; estimation{4}{1} = VSpaceEst; estimation{4}{2} = 'VSpaceEst'; estimation{5}{1} = HtextSize_freq; estimation{5}{2} = ['Horizontal textsize';'Frequency ']; estimation{6}{1} = VtextSize_freq; estimation{6}{2} = ['Vertical textsize';'Frequency ']; estimation{7}{1} = margin; estimation{7}{2} = 'margin'; estimation{8}{1} = MS_H; estimation{8}{2} = 'MS_H'; estimation{9}{1} = MS_V; estimation{9}{2} = 'MS_V'; %%%%%% Show grided text picture %%%%%% osV = 0; osH = 0; ii = 1; jj= 1; [nrow,ncol] = size(textpic2); textpicshow = uint8(textpic2*255); textpicshow(:,:,2) = textpicshow(:,:,1); textpicshow(:,:,3) = textpicshow(:,:,1); textpicshow(1:margin,:,3) = 0; textpicshow(:,1:margin,3) = 0; textpicshow(end-margin+1:end,:,3) = 0; textpicshow(:,end-margin+1:end,3) = 0; for r = 1+margin : textHeightEst+VSpaceEst : nrow-textHeightEst-VSpaceEst; textpicshow( (r+textHeightEst+margin+osV):(r+textHeightEst+VSpaceEst-1-margin+osV) , : , 3 ) = 0; eval('osV = osV + ( MS_V(2*ii)+MS_V(2*ii+1) ) - (textHeightEst+VSpaceEst);','disp(r);') ii = ii + 1; end for c = 1+margin : textWidthEst+HSpaceEst : ncol-textWidthEst-HSpaceEst; textpicshow( : , (c+textWidthEst+margin+osH):(c+textWidthEst+HSpaceEst-1-margin+osH) , 3 ) = 0; eval('osH = osH + ( MS_H(2*jj)+MS_H(2*jj+1) ) - (textWidthEst +HSpaceEst);','disp(c);') % disp(sprintf('osH = %d, jj = %d',osH,jj)) jj = jj + 1; end figure(1), imshow(textpicshow) ii = ii -1; jj = jj - 1; osV = osV - (( MS_V(2*ii)+MS_V(2*ii+1) ) - (textHeightEst+VSpaceEst)); osH = osH - (( MS_H(2*jj)+MS_H(2*jj+1) ) - (textWidthEst +HSpaceEst)); %%%%%% End Show grided text picture %%%%%% %%% Subfunctions % countMarkSpace - count consecutive number of zeros and number of non-zeros % % argument: sum - an array containing consecutive zeroes and non-zeros % output: MS - an array with elements equal to the number of consecutive % zeros or non-zeros (Space or Mark) % function MS = countMarkSpace(sum) MSIndex = 1; count = 1; sumBinary = (sum~=0); for ii=2:length(sumBinary), if sumBinary(ii)~=sumBinary(ii-1), MS(MSIndex) = count; MSIndex = MSIndex+1; count = 1; else count = count+1; end end MS(MSIndex) = count; % estimateMS - estimate MarkSpace using number of occurances % % argument: MS - an array containing widths of mark and space % output: textSize - sorted widths of mark space according to occurances % freq - the corresponding occurances (descending) % function [textSize,freq] = estimateMS(MS) for kk=max(MS):-1:1, histogram(kk) = length(find(MS==kk)); end [freq,textSize] = sort(-histogram); freq = -freq; freq = freq(1:min(find(freq==0))-1); textSize = textSize(1:length(freq)); return if 0 disp('numCharV = (nrow+VSpaceEst-2*margin)/(textHeightEst+VSpaceEst)') disp(sprintf('numCharV=(%3d+%3d-2*%3d)/(%3d+%3d)=%.3f',... nrow,VSpaceEst,margin,textHeightEst,VSpaceEst,... (nrow+VSpaceEst-2*margin)/(textHeightEst+VSpaceEst))) disp('numCharH = (ncol+HSpaceEst-2*margin)/(textWidthEst +HSpaceEst)') disp(sprintf('numCharH=(%3d+%3d-2*%3d)/(%3d+%3d)=%.3f',... ncol,HSpaceEst,margin,textWidthEst,HSpaceEst,... (ncol+HSpaceEst-2*margin)/(textWidthEst+HSpaceEst))) disp(sprintf('%s:%s,\n%s:%s',... 'MS_V(1)-textHeightEst+MS_V(2)+1-margin','sum(MS_V)-MS_V(end)+margin',... 'MS_H(1)-textWidthEst +MS_H(2)+1-margin','sum(MS_H)-MS_H(end)+margin')); disp(sprintf('%3d-%3d+%3d+1-%3d:%3d-%3d+%3d,\n%3d-%3d+%3d+1-%3d:%3d-%3d+%3d',... MS_V(1),textHeightEst,MS_V(2),margin,sum(MS_V),MS_V(end),margin ,... MS_H(1),textWidthEst, MS_H(2),margin,sum(MS_H),MS_H(end),margin)) disp(sprintf('%3d:%3d,\n%3d:%3d',... MS_V(1)-textHeightEst+MS_V(2)+1-margin,sum(MS_V)-MS_V(end)+margin,... MS_H(1)-textWidthEst +MS_H(2)+1-margin,sum(MS_H)-MS_H(end)+margin)); end