4 votes

Réduction de bruit d'image OCR

Bonjour, j'ai un problème de segmentation de l'image suivante ci-dessous. Il s'agit d'un personnage coloré qui doit être reconnu. J'utilise la netteté, la déconvolution de Wiener et lissage de Wiener. Ensuite, je segmente l'image avec un regroupement fuzzy c-moyennes (3 classes). Mais dans le cas de la lettre E, le meilleur résultat que j'obtiens est sans netteté, déconvolution et lissage, juste avec une segmentation fcm seuillée. Cependant, je devrais obtenir un meilleur résultat que celui-ci, où je pourrais combiner ces deux parties en une seule (pas seulement la partie supérieure blanche avec l'autre moitié noire).

Comment pourrais-je résoudre ce problème pour être plus robuste et fonctionner avec d'autres images, par exemple le 5 sur l'image? Le résultat du 5 est avec netteté, déconvolution et lissage, en plus du regroupement fcm. Comment pourrais-je le rendre plus connecté peut-être?

Je serais vraiment reconnaissant de toute l'aide que je pourrais obtenir, s'il vous plaît, oh et je fais cela dans matlab... donc ce serait bien d'obtenir de l'aide de là-bas, merci!

Ceci est la lettre E, je voudrais obtenir un élément en entier

Deuxième image est le numéro 5, devrait être plus lisse et connecté, sans espaces entre les lignes

EDIT:

Mon code suivant est le suivant: function [bw,level]=fcmthresh(IM,sw) if (nargin<1) error('Vous devez fournir une image.'); elseif (nargin==1) sw=0; elseif (sw~=0 && sw~=1) error('sw doit être 0 ou 1.'); end

data=reshape(IM,[],1);
[center,member]=fcm(data,3);
[center,cidx]=sort(center);
member=member';
member=member(:,cidx);
[maxmember,label]=max(member,[],2);
if sw==0
    level=(max(data(label==1))+min(data(label==2)))/2;
else
    level=(max(data(label==2))+min(data(label==3)))/2;
end
bw=im2bw(IM,level);

function img=wienerDeblur(im)
ImgNoisyBlurry = im2double(im);
PSF = fspecial('laplacian'); %LEN, THETA add parameters for 'motion'

noise_var = 0.0001; %0.0001
estimated_nsr = noise_var / var(ImgNoisyBlurry(:));
wnr3 = deconvwnr(ImgNoisyBlurry, PSF, estimated_nsr);
img = wnr3;

end

H = fspecial('unsharp');
im = imfilter(im,H,'replicate');
im = wienerDeblur(im);
im = wienerSmoothing(im);

C'est tout le code, plus j'utilise juste fcmthres pour la lettre E, car cela fonctionne le mieux. J'ai lu sur le traitement morphologique de l'image (dilatation, érosion), donc cela pourrait peut-être fonctionner.

Y a-t-il de meilleures techniques pour le contraste de l'image et l'élimination du bruit?

1voto

mfrellum Points 149

Vous pouvez essayer la détection de contours canny sur le canal h (essayez tous les canaux et comparez) (rgb2hsv) suivie d'opérations morphologiques pour fermer les courbes et remplir (imfill) les courbes des chiffres et des lettres. Je n'ai pas accès à Matlab en ce moment, mais j'ai réussi avec cela sur un problème similaire.

http://www.mathworks.se/help/techdoc/ref/rgb2hsv.html http://www.mathworks.se/help/toolbox/images/ref/edge.html http://www.mathworks.se/help/toolbox/images/ref/imfill.html

0voto

exussum Points 6091

Après l'avoir en noir et blanc, vous pouvez utiliser la Décomposition en Valeurs Singulières (http://fr.wikipedia.org/wiki/Décomposition_en_valeurs_singulières) et vous pouvez probablement comparer les valeurs singulières.

Pour la suppression du bruit, mettez les plus petites valeurs singulières à 0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X