2016-07-22 44 views
-1

我已經使用padarray(代碼如下)進行了規範化,但下一個進程(特徵提取)的結果不夠好。因爲它不完全是分段的零件特徵,而且還包括襯墊部分。尺寸對分段字符圖像的規範化

enter image description here -sample圖像(分段字符)

我需要正常化僅適用於圖像的分割字符,把它的中心,和平方(它應該是[64 64])。它也應該保持寬高比,不會拉伸或扭曲圖像,因此字符圖像將保持成比例。

% Normalization done using pad 
function p = pad (im) 
nrows = size(im,1); 
ncols = size(im,2); 

d = abs(ncols-nrows); % difference between ncols and nrows: 
if(mod(d,2) == 1)  % if difference is an odd number 
    if (ncols > nrows) % we add a row at the end 
     im = [im; zeros(1, ncols)]; 
     nrows = nrows + 1; 
    else     % we add a col at the end 
     im = [im zeros(nrows, 1)]; 
     ncols = ncols + 1; 
    end 
end 

if ncols > nrows 
    im = padarray(im, [(ncols-nrows)/2 0]); 
else 
    im = padarray(im, [0 (nrows-ncols)/2]); 
end 

im = imresize(im, [64 64]); 

% figure, imshow (im); 

p = (im); 

% Here im is a 5x5 matix, not perfectly centered 
% because we added an odd number of columns: 3 
% Original code by Sembei Norimaki, modified by Ana 

此代碼的一些修改,仍然不起作用。所以,我需要一個關於此代碼修改的建議或任何推薦的方法。

任何幫助將不勝感激。謝謝。

+0

目前還不清楚你想要做什麼。你想修剪圖像並將它們複製到64x64零陣列的中心嗎?你的圖片全部保證小於64x64嗎? –

+0

你是什麼意思將它們複製到零陣列?你能解釋更多嗎? ||我需要將所有圖像標準化(調整大小)爲[64 64],同時仍保持高寬比。 ||大小各不相同,比64x64小,大。我可以使用「imresize」,但它會使圖像變形或拉伸,這意味着它會產生不成比例的結果。 ||你有什麼建議嗎?感謝您的迴應。 –

+1

如果您使用'imresize'只使用圖像參數和標量(而不是2元素矢量),則寬高比將保持不變。你只關心寬高比,還是你希望字母的大小相互正確? (例如,在你的例子中,'部分'不填充他們的框,這是故意的嗎? –

回答

1

不是100%肯定這就是你以後,但這裏有雲:

例子:(假定圖片 'alif.png', 'dod.png', 'ha.png' 和「UAU。 png')。

%%%% in file 'processLetter.m' %%%% 
function L = processLetter (L) 
    %% Step 1 : Trim padding. 
    tmp = find (L); % Get linear indices of nonzero elements 
    [Row_subs, Col_subs] = ind2sub (size (L), tmp); % Convert to row/col subscripts 
    L = L(min (Row_subs) : max (Row_subs), min (Col_subs) : max (Col_subs)); % trim 

    %% Resize such that the largest dimension is scaled to 64 pixels 
    Rows = size (L, 1); Cols = size (L, 2); 
    if Rows > Cols; Resize_vec = [64, NaN]; 
    else   Resize_vec = [NaN, 64]; 
    end 

    L = imresize (L, Resize_vec); 
    Rows = size (L, 1); Cols = size (L, 2); 

    %% Pad smallest dimension to 64 pixels 
    if Rows > Cols; 
    LeftPad = abs (floor ((64 - Cols)/2)); 
    RightPad = abs (floor ((Cols - 64)/2)); 
    L = padarray (L, [0, LeftPad ], 'pre'); 
    L = padarray (L, [0, RightPad], 'post'); 
    else 
    TopPad = abs (floor ((64 - Rows)/2)); 
    BottomPad = abs (floor ((Rows - 64)/2)); 
    L = padarray (L, [TopPad, 0], 'pre'); 
    L = padarray (L, [BottomPad, 0], 'post'); 
    end 

    L = mat2gray (L); 
    L = L > 0.5; % in case L was a 'double' matrix -- needed in Octave 
end 
%%%% end of file 'processLetter.m' %%%% 

然後調用具有:

Alif = imread ('alif.png'); Dod = imread ('dod.png'); 
Ha = imread ('ha.png' ); Uau = imread ('uau.png'); 
Alif = double (Alif); Dod = double (Dod); Ha = double (Ha); Uau = double (Uau); % if using octave -- octave 'imresize' function throws an error if image is logical instead of double 
subplot (2, 4, 1); imagesc (Alif); axis equal off; colormap gray; 
subplot (2, 4, 2); imagesc (Dod); axis equal off; 
subplot (2, 4, 3); imagesc (Ha ); axis equal off; 
subplot (2, 4, 4); imagesc (Uau); axis equal off; 
subplot (2, 4, 5); imagesc (processLetter (Alif)); axis equal off; 
subplot (2, 4, 6); imagesc (processLetter (Dod)); axis equal off; 
subplot (2, 4, 7); imagesc (processLetter (Ha) ); axis equal off; 
subplot (2, 4, 8); imagesc (processLetter (Uau)); axis equal off; 

結果:

enter image description here

這是你以後樣的事情?

+0

注意:上面的代碼與Octave兼容,但是您可能必須首先顯式加載'image'包,因爲'imresize()'依賴於它。 –

+0

(從這裏轉換的字母表圖像:http://www.joaoleitao.com/names-arabic/arabic-alphabet-abc/) –

+1

I我正在使用matlab實現盟友。 ||感謝您提供的代碼。我會盡力。 –