Tutoriel : Amélioration d'images

Identification

I. Transformation de la table des couleurs

I.1. Transformation linéaire par morceau

Le but est donner plus de niveaux de gris pour représenter les objets que pour représenter le fond d'image qui est considéré comme plus homogène.

Dans l'exemple proposé ici, les pixels de l'intervalle [74..255] correspondent au fond d'image (le ciel). Ils sont compressés dans le nouvel intervalle [200..255]. Les pixels de l'intervalle [0..73] correspondent aux objets (église). Ils sont étendus dans le nouvel intervalle [0..199].

Les valeurs de seuil peuvent être obtenues automatiquement par une segmentation préalable en fond / objets.

Script Pandore (bash)

pthresholding 74 255 images/churchgray.pan background.pan
plineartransform 0 200 255 background.pan background1.pan
pmask background1.pan background.pan background2.pan

pthresholding 0 73 images/churchgray.pan objects.pan
plineartransform 0 0 199 objects.pan objects1.pan
pmask objects1.pan objects.pan objects2.pan
por background2.pan objects2.pan result-I-1-1.pan

Résultat

Image initiale. Image corrigée.

I.2. Equalisation d'histogramme

L'égalisation d'histogramme permet de renforcer les détails utilisant plus de niveaux de gris pour les pixels de forte probabilité, et d'utiliser moins de niveaux de gris pour les pixels de faible probabilité.

Cette opération s'applique très mal aux images couleur si on agit bande par bande de espace Rouge-Vert-Bleu. Il est nécessaire de l'appliquer uniquement sur la composante luminance de l'espace Teinte-Saturation-Luminance.

Script Pandore (bash)

phistogramequalization 0 255 images/churchgray.pan result-I-2-1.pan 

Résultat

Image initiale. Image corrigée.

I.3 Copie d'histogramme

Le but est de modifier l'histogramme d'une image en copiant la forme de l'histogramme d'une autre image. L'intérêt est de modifier à la main l'histogramme d'une image exemple avec un logiciel de dessin approprié puis d'appliquer cette même modification à toutes les autres images.

Script Pandore (bash)

phistogramspecification images/chuchgray.pan modified-tangram.pan output.pan

Résultat

Image initiale. Histogramme modifié à la main.
Autre image initiale. Image modifiée par copie d'histogramme.

II. Renforcement du contraste

Le but est d'améliorer le contraste des objets par rapport au fond de l'image. L'amélioration se fait autour des bords des objets.

II.1. Avec le laplacien

Les bords des objets sont détectés à partir du laplacien de l'image (dérivée seconde). Ainsi, en additionnant l'image par une certaine fraction de son laplacien, on creuse le bord à l'extérieur de l'objet et on renforce la hauteur du bord à l'intérieur de l'objet.

g(x,y) = f(x,y) + k . ∇(f(x,y)

k est le degré de renforcement du contraste.

Script Pandore (bash)

k=3
pim2sf images/forest.pan tmp1.pan
pexponentialfiltering 0.6 tmp1.pan tmp2.pan
pgetband 0 tmp2.pan | plaplacian 4 - tmp3-0.pan
pgetband 1 tmp2.pan | plaplacian 4 - tmp3-1.pan
pgetband 2 tmp2.pan | plaplacian 4 - tmp3-2.pan
pimgs2imc tmp3-0.pan tmp3-1.pan tmp3-2.pan tmp3.pan
pmultcst $k tmp3.pan tmp4.pan
padd tmp1.pan tmp3.pan | pim2uc - result-II-1-1.pan

Résultat

Image initiale. Image modifiée.

II.2. Sharpening spatial filters

Approximation du laplacien en utilisant une matrice de convolution.

g(x,y)=f(x,y)-L2f(x,y) { if the center coefficient is <0 }
g(x,y)=f(x,y)+L2f(x,y) { if the center coefficient is >0 }
Rem L2f(x,y) is the laplacian of the image f(x,y)
 0  -1  0
-1 5*k -1
 0  -1  0

Script Pandore (bash)

psharp 8 1.5 images/forest.pan result-II-2-1.pan

Résultat

Image initiale. Image corrigée.

II.3. Réhaussement du contraste par approche morphologique

Une simple opération de rehaussement de contraste morpholoqique peut être obtenue à partir du calcul des chapeaux haut-de-forme blanc et noir. Un chapeau haut-de-forme permet de détecter les pics (blancs) ou les trous (noirs) dans la fonction niveaux de gris. Le chapeau haut-de-forme blanc peut être ajoutée à l'image initiale pour améliorer la visibilité des détails blancs, alors que le chapeau haut-de-forme noir peut être soustrait à l'image pour améliorer la visibilité des détails noirs.

Κth = (f + WTH(f)) - BTH(f)

Pandore Script (bash)

perosion 2 2 esophagusgray.pan i1.pan
pdilatation 2 2 i1.pan i2.pan
psub esophagusgray.pan i2.pan wth.pan

pdilatation 2 2 esophagusgray.pan i3.pan
perosion 2 2 i3.pan i4.pan
psub i4.pan esophagusgray.pan bth.pan

pim2sl esophagusgray.pan i5.pan
padd i5.pan wth.pan i6.pan
psub i6.pan bth.pan enhanced.pan

Résultats

La principale différence peut être observée à l'intérieur des cellules.

Image initiale (f) Chapeau haut-de-forme blanc WTH(f) (inversé)
Chapeau haut-de-forme noir BTH(f) (inversé) Image résultat: f+WTH(f)-BTH(f)

III. Masquage flou (Unsharp masking or high boost filtering)

Le unsharp masking opère par soustraction la version lissée de l'image initiale suivie d'un ajustement des niveaux de gris dans l'image de différence. Il permet de préserver les détails de hautes fréquences en même temps que le lissage des surfaces homogènes. Il ameliore les details et augmente les contours qui sont non visibles dans l'image initiale.

Malheureusement, le filtre sharpening a aussi l'effet indésirable d'accroître le bruit dans l'image filtrée.

Sharpen the image content. L'opération consiste à additionner une certaine fraction d'image initale à une version filtrée par un passe-bas de cette image. La version filtrée par un passe-haut est construite en soustrayant une version lisée de l'image initiale à l'image initiale.
où A spécifie la proportion of de l'image initiale à ajouter (A>=1), f(x,y) est l'image initiale, fhp(x,y) la version filtrée par passe-haut de f(x,y) et g(x,y) l'image résultat.
Quand A=1 alors le filtrage high-boost est réduit à un filtrage passe-haut Plus A est grand, moins le contraste est fort.

III.1. Unsharp masking

paramètre value réelle >= 1

 0 -1  0
-1 A+4 -1
0  -1  0
A=1 -> "standard" laplacian sharpening.

Rem: non-linear filters are inadequat for objective enhancement since they are capable of removing image features.

III.2. Unsharp masking

Generating a sharp image by substracting from an image a blurred version of itself.

fhp(x,y) = f(x,y) - flp(x,y)

In frequency domain: Hhp(u,v)=1-Hlp(u,v)

III.3. Using gaussian filter as lowpass filtering (s k in.pan out.pan)

Parameters:

Script Pandore (bash)

Example: unsharpmasking 0.8 0.7 tangram.pan

pim2sf in.pan i1.pan
pgaussianfiltering $s i1.pan i2.pan
psub i1.pan i2.pan i3.pan
pmultcst $k i3.pan i4.pan
padd i1.pan i4.pan i5.pan
pclipvalues 0 255 i5.pan out.pan

Résultat

Image initiale Image corrigée

III.4. Using median lowpass filtering (s k in.pan out.pan)

Parameters:

Script Pandore (bash)

Example: unsharpmasking 2 0.7 tangram.pan

pim2sl in.pan i1.pan
pmedianfiltering $s i1.pan i2.pan
psub i1.pan i2.pan i3.pan
pmultcst $k i3.pan i4.pan
padd i1.pan i4.pan i5.pan
pclipvalues 0 255 i5.pan out.pan

Résultat

Image initiale Image corrigée

III.5. Using Butterworth highpass filtering (cutin cutoff order k in.pan out.pan)

Script Pandore (bash)

Example: unsharpmasking 0 50 2 0.7 tangram.pan

pproperty 0 in.pan
ncol1=`pstatus`
pproperty 1 in.pan
nrow1=`pstatus`
pproperty 2 in.pan
ndep1=`pstatus`

psetcst 0 in.pan i1.pan
pfft in.pan i1.pan i2.pan i3.pan
pproperty 0 i2.pan
ncol2=`pstatus`
pproperty 1 i2.pan
nrow2=`pstatus`
pproperty 2 i2.pan
ndep2=`pstatus`
pbutterworthfilter $ncol2 $nrow2 $ndep2 1 $cutin $cutoff $order i4.pan # smooth
pmultcst $k i4.pan i13.pan
pmult i2.pan i13.pan i5.pan
pmult i3.pan i13.pan i6.pan
pifft i5.pan i6.pan i7.pan i8.pan
pextractsubimage 0 0 0 $ncol1 $nrow1 $ndep1 i7.pan i9.pan
pim2sf in.pan i10.pan
padd i9.pan i10.pan i11.pan
pclipvalues 0 255 i11.pan out.pan

Résultat

Image initiale Image corrigée

III.6. Using Butterworth lowpass filtering (cutin cutoff order k in.pan out.pan)

Script Pandore (bash)

Example: unsharpmasking 0 50 2 0.7 tangram.pan

pproperty 0 in.pan
ncol1=`pstatus`
pproperty 1 in.pan
nrow1=`pstatus`
pproperty 2 in.pan
ndep1=`pstatus`
psetcst 0 in.pan i1.pan
pfft in.pan i1.pan i2.pan i3.pan
pproperty 0 i2.pan
ncol2=`pstatus`
pproperty 1 i2.pan
nrow2=`pstatus`
pproperty 2 i2.pan
ndep2=`pstatus`
pbutterworthfilter $ncol2 $nrow2 $ndep2 0 $cutin $cutoff $order i4.pan #smooth
pmult i2.pan i4.pan i5.pan
pmult i3.pan i4.pan i6.pan
pifft i5.pan i6.pan i7.pan i8.pan
pextractsubimage 0 0 0 $ncol1 $nrow1 $ndep1 i7.pan i9.pan
pim2sf in.pan i10.pan
psub i10.pan i9.pan i11.pan
pmultcst $k i11.pan i12.pan
padd i10.pan i12.pan i13.pan
pclipvalues 0 255 i13.pan out.pan

Résultat

Image initiale Image corrigée

III.7. Using Gaussian highpass filtering (cutin cutoff k in.pan out.pan)

Script Pandore (bash)

Example: unsharpmasking 0 20 0.7 tangram.pan

pproperty 0 in.pan
ncol1=`pstatus`
pproperty 1 in.pan
nrow1=`pstatus`
pproperty 2 in.pan
ndep1=`pstatus`

psetcst 0 in.pan i1.pan
pfft in.pan i1.pan i2.pan i3.pan
pproperty 0 i2.pan
ncol2=`pstatus`
pproperty 1 i2.pan
nrow2=`pstatus`
pproperty 2 i2.pan
ndep2=`pstatus`
pgaussianfilter $ncol2 $nrow2 $ndep2 1 $cutin $cutoff i4.pan # smooth
pmultcst $k i4.pan i13.pan
pmult i2.pan i13.pan i5.pan
pmult i3.pan i13.pan i6.pan
pifft i5.pan i6.pan i7.pan i8.pan
pextractsubimage 0 0 0 $ncol1 $nrow1 $ndep1 i7.pan i9.pan
pim2sf in.pan i10.pan
padd i9.pan i10.pan i11.pan
pclipvalues 0 255 i11.pan out.pan

Résultat

Image initiale Image corrigée

IV. High-filtering emphasis filtering

Generates a sharpened image by adding a certain proportion of the input image to a certain proportion of highpass filtered version of itself. That is:
g(x,y)=a*f(x,y) + b*fhp(x,y)
with a>=0 and b> a.
It generalizes the high-boost filtering, and it is reduced to high-boost filtering when a=(A-1) and b=1. Typical values of a are in the range 0.25 to 0.5 and typical values of b are in the range 1.5 to 2.0.

IV.1. High-boost filtering: increases the contribution made by the image.

When the image is darker than desired.

(a >=1)

fhb(x,y) = Af(x,y)-flp(x,y)
fhb(x,y) = (A-1)f(x,y) + fhp(x,y)
->Advantage: can be implemented directly with one filter: Hhb()u,vc)=(A-1) + Hhp(u,v)

IV.2. High-frequency emphasis filtering

Hhfe(u,v)=a+bHhp(u,v)
a>=0; b>a. Typical values are:
a=0.25 -> 0.5
b=1.5->20.0
Rem : si a =A-1 et b=1 -> reduced to high-boost filtering Hhb(u,v)=(A-1)+Hhp(u,v))

IV.3. Using Butterworth highpass filtering

Script Pandore (bash)

Example: highfrequencyfiltering 0.5 2.0

pproperty 0 in.pan
ncol1=`pstatus`
pproperty 1 in.pan
nrow1=`pstatus`
pproperty 2 in.pan
ndep1=`pstatus`

psetcst 0 in.pan i1.pan
pfft in.pan i1.pan i2.pan i3.pan
pproperty 0 i2.pan
ncol2=`pstatus`
pproperty 1 i2.pan
nrow2=`pstatus`
pproperty 2 i2.pan
ndep2=`pstatus`
pbutterworthfilter $ncol2 $nrow2 $ndep2 1 0 20 2 i4.pan # smooth
pmultcst $a i4.pan i12.pan
paddcst $b i12.pan i13.pan
pmult i2.pan i13.pan i5.pan
pmult i3.pan i13.pan i6.pan
pifft i5.pan i6.pan i7.pan i8.pan
pextractsubimage 0 0 0 $ncol1 $nrow1 $ndep1 i7.pan i9.pan

pclipvalues 0 255 i9.pan out.pan

Résultat

Image initiale Image corrigée

IV.4. Filtre Homomorphique

Le filtre homomorphique permet d'unifier la luminance sur l'image et d'accroîte le contraste. Il est basé sur modèle de luminance-réflectance. Le but est d'améliorer l'apparence d'une image en comprimant l'intervalle des valeurs de niveaux de gris et rehaussant le contraste simultanément.

L'ajustement de la pente:

ln -> FFT -> H(u,v) -> IFFT -> exp 

H(u,v) = (gammaH-gammaL)[1-exp(-c (D^2(u,v)/D0^2))]+gammaL

c: control sharpness
Ex: gammaL=0.5
gammaH=2.0

Script Pandore (bash)

Example: homomorphicfiltering 1.5 2.0 20 2 churchgray.pan

high=2.0
low=1.5
c=`echo "scale = 1; $high - $low" | bc`
pproperty 0 images/churchgray.pan
ncol1=`pstatus`
pproperty 1 images/churchgray.pan
nrow1=`pstatus`
pproperty 2 images/churchgray.pan
ndep1=`pstatus`

paddcst 1 images/churchgray.pan i0.pan
plog i0.pan i0.pan
psetcst 0 i0.pan i1.pan
pfft i0.pan i1.pan i2.pan i3.pan
pproperty 0 i2.pan
ncol2=`pstatus`
pproperty 1 i2.pan
nrow2=`pstatus`
pproperty 2 i2.pan
ndep2=`pstatus`
pbutterworthfilter $ncol2 $nrow2 $ndep2 1 0 $cutoff 1 i3.pan i4.pan # smooth
pmultcst $c i4.pan i12.pan
paddcst $low i12.pan i13.pan
pmult i2.pan i13.pan i5.pan
pmult i3.pan i13.pan i6.pan
pifft i5.pan i6.pan i7.pan i8.pan
pextractsubimage 0 0 0 $ncol1 $nrow1 $ndep1 i7.pan i9.pan
pexp i9.pan i11.pan

paddcst -1 i11.pan i1.pan

pclipvalues 0 255 i11.pan out.pan

Résultat

Image initiale. Image corrigée.

The Pantheon project
Image Team GREYC Laboratory
UMR CNRS 6072 - ENSICAEN - University of Caen, France
This page was last modified on 22 August 2016