Set additiveGaussian, mais pas encore débruitage

This commit is contained in:
xdrm-brackets 2015-09-28 19:03:01 +02:00
parent a4bac4f37f
commit ddc83b710d
28 changed files with 349 additions and 65 deletions

BIN
code/AdditiveGaussian.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 257 KiB

View File

@ -36,7 +36,8 @@ print "+---------------------------+"
print "| %s |" % exactLength("TESTS DE BRUIT", 25, 0) print "| %s |" % exactLength("TESTS DE BRUIT", 25, 0)
print "| %s |" % exactLength("", 25, 0) print "| %s |" % exactLength("", 25, 0)
print "| 10) %s |" % exactLength("Salt&Pepper", 21, -1) print "| 10) %s |" % exactLength("Salt&Pepper", 21, -1)
print "| 11) %s |" % exactLength("Additif", 21, -1) print "| 11) %s |" % exactLength("Additif (Bernouilli)", 21, -1)
print "| 12) %s |" % exactLength("Additif (Gaussien)", 21, -1)
print "+---------------------------+" print "+---------------------------+"
print "| %s |" % exactLength("TESTS DE DIFFERENCES", 25, 0) print "| %s |" % exactLength("TESTS DE DIFFERENCES", 25, 0)
print "| %s |" % exactLength("", 25, 0) print "| %s |" % exactLength("", 25, 0)
@ -118,7 +119,17 @@ elif action == 11:
if outS != "": if outS != "":
arg2 = int(outS) arg2 = int(outS)
print startStr print startStr
testAdditiveNoise(arg1, arg2) # teste le bruitage/débruitage de type "Additif" testAdditiveBernouilliNoise(arg1, arg2) # teste le bruitage/débruitage de type "Additif"
elif action == 12:
inS = raw_input("sigma [10]: ")
outS = raw_input("seuil débruitage [35] : ")
arg1, arg2 = 10, 35
if inS != "":
arg1 = int(inS)
if outS != "":
arg2 = int(outS)
print startStr
testAdditiveGaussianNoise(arg1, arg2) # teste le bruitage/débruitage de type "Additif"
# performances # performances
elif action == 20: elif action == 20:
print startStr print startStr

Binary file not shown.

Before

Width:  |  Height:  |  Size: 257 KiB

After

Width:  |  Height:  |  Size: 257 KiB

View File

@ -288,18 +288,18 @@ def testSaltAndPepper(seuilSet=50, seuilUnset=1, borneUnset=1, smooth=1):
# teste les fonction de bruitage et débruitage de type "Additif" # # teste les fonction de bruitage et débruitage de type "Additif de Bernouilli" #
######################################################################## ################################################################################
# @sysarg 1 le fichier d'origine # @sysarg 1 le fichier d'origine
# @stsarg 2 le fichier de sortie (bruité PUIS débruité) # @stsarg 2 le fichier de sortie (bruité PUIS débruité)
# #
# @file SaltAndPepper.bmp le fichier bruité # @file AdditiveNoise.bmp le fichier bruité
# #
# @history # @history
# Parse le fichier d'origine # Parse le fichier d'origine
# Bruite l'image' et l'enregistre dans "AdditiveNoise.bmp" # Bruite l'image' et l'enregistre dans "AdditiveNoise.bmp"
# Débruite l'image et l'enregistre dans le fichier de sortie # Débruite l'image et l'enregistre dans le fichier de sortie
def testAdditiveNoise(seuilA=10, seuilB=35): def testAdditiveBernouilliNoise(seuilA=10, seuilB=35):
t = Timer(); t = Timer();
@ -322,7 +322,7 @@ def testAdditiveNoise(seuilA=10, seuilB=35):
print "| Creating Additive |",; t.reset(); print "| Creating Additive |",; t.reset();
FX.Additive.set(img.content.map, seuil=seuilA) FX.Additive.setBernouilli(img.content.map, seuil=seuilA)
print "%s |" % (t.get()) print "%s |" % (t.get())
# Unparsing # Unparsing
@ -332,7 +332,7 @@ def testAdditiveNoise(seuilA=10, seuilB=35):
# image to stdout # image to stdout
print "| Writing file |",; t.reset(); print "| Writing file |",; t.reset();
img.write( "AdditiveNoise.bmp" ) img.write( "AdditiveBernouilli.bmp" )
print "%s |" % (t.get()) print "%s |" % (t.get())
@ -363,6 +363,81 @@ def testAdditiveNoise(seuilA=10, seuilB=35):
# teste les fonction de bruitage et débruitage de type "Additif Gaussien" #
###########################################################################
# @sysarg 1 le fichier d'origine
# @stsarg 2 le fichier de sortie (bruité PUIS débruité)
#
# @file AdditiveNoise.bmp le fichier bruité
#
# @history
# Parse le fichier d'origine
# Bruite l'image' et l'enregistre dans "AdditiveNoise.bmp"
# Débruite l'image et l'enregistre dans le fichier de sortie
def testAdditiveGaussianNoise(sigma=10, seuil=35):
t = Timer();
# lecture du fichier
print "| Reading Image |",; t.reset();
with open( sys.argv[1] ) as file:
binFile = file.read()
print "%s |" % (t.get())
img = BMPFile(); # Instanciation du BMPFile
# Parsing
print "| Parsing file |",; t.reset();
img.parse( binFile );
print "%s |" % (t.get())
print "| Creating Additive |",; t.reset();
FX.Additive.setGaussian(img.content.map, sigma=sigma)
print "%s |" % (t.get())
# Unparsing
print "| Unparsing file |",; t.reset();
img.unparse()
print "%s |" % (t.get())
# image to stdout
print "| Writing file |",; t.reset();
img.write( "AdditiveGaussian.bmp" )
print "%s |" % (t.get())
print "| Removing Additive |",; t.reset();
# img.content.map = FX.Additive.unset(img.content.map, seuil=seuilB)
img.content.map = FX.Additive.unset2(img.content.map, seuil=seuil)
print "%s |" % (t.get())
# Unparsing
print "| Unparsing file |",; t.reset();
img.unparse()
print "%s |" % (t.get())
# image to stdout
print "| Writing file |",; t.reset();
img.write( sys.argv[2] )
print "%s |" % (t.get())

View File

@ -9,12 +9,12 @@ from BMPFile import RGBPixel
class Additive_Noise: class Additive_Noise:
# Applique le bruitage de type "Additif" sur la matrice de pixels # # Applique le bruitage de type "Additif de Bernouilli" sur la matrice de pixels #
################################################################### #################################################################################
# @param pixelMap Matrice de pixel à traiter (modifier) # @param pixelMap Matrice de pixel à traiter (modifier)
# @param seuil pourcentage de l'image à bruiter (50% <=> 1 pixel sur 2 est bruité) # @param seuil pourcentage de l'image à bruiter (50% <=> 1 pixel sur 2 est bruité)
# #
def set(self, pixelMap, seuil=10): def setBernouilli(self, pixelMap, seuil=10):
seuil = float(seuil); seuil = float(seuil);
while seuil >= 1: while seuil >= 1:
@ -41,6 +41,48 @@ class Additive_Noise:
pixelMap[y][x].b + randomAdd pixelMap[y][x].b + randomAdd
); );
# Applique le bruitage de type "Additif Gaussien" sur la matrice de pixels #
############################################################################
# @param pixelMap Matrice de pixel à traiter (modifier)
# @param seuil pourcentage de l'image à bruiter (50% <=> 1 pixel sur 2 est bruité)
#
def setGaussian(self, pixelMap, sigma=10):
width = len( pixelMap[0] )
height = len( pixelMap )
sigma = float(sigma);
# vérification de la cohérence de sigma
if -255 > sigma or sigma > 255:
print "sigma have incoherent value"
exit();
from numpy import random # random.rand(height,width) renvoie une matrice de flottants entre 0 et 1
factors = random.rand(height, width)
# on parcourt en même temps les facteurs aléatoires et la matrice de pixels
for lineP, lineF in zip(pixelMap, factors):
for pixel, fact in zip(lineP, lineF):
r = int( pixel.r + sigma * fact )
g = int( pixel.g + sigma * fact )
b = int( pixel.b + sigma * fact )
# on attribue les valeurs aux pixels
pixel.setRGB(
r = 0 if r<0 else ( 255 if r > 255 else r),
g = 0 if g<0 else ( 255 if g > 255 else g),
b = 0 if b<0 else ( 255 if b > 255 else b)
);
# Applique le débruitage de type "Additif" sur la matrice de pixels # # Applique le débruitage de type "Additif" sur la matrice de pixels #
##################################################################### #####################################################################
# @param pixelMap Matrice de pixel à traiter (modifier) # @param pixelMap Matrice de pixel à traiter (modifier)

View File

@ -255,8 +255,8 @@
% === SECT1 - P&S === % % === SECT1 - P&S === %
% =================== % % =================== %
\section{Le bruit de type <<Poivre \& Sel>>} \section{Le bruit de type <<Poivre \& Sel>>}
\textbf{Définition graphique: }L'image est parsemée de pixels ayant une teinte extrême (blancs ou noirs) sans rapport avec leur contexte (voisinage).\\ \textbf{Définition graphique: }L'image est parsemée de pixels ayant une teinte extrême (blancs ou noirs) sans rapport avec leur contexte (voisinage).\\\\
\textbf{Bruitage: }Le bruitage se fait en fonction du paramètre réel \begin{math}seuil\in[0;1]\end{math}. Il y a donc \begin{math}n = seuil\times width\times height\end{math} couples \begin{math}(x, y)\end{math} aléatoires qui sont en noir ou blanc (choix aléatoire), ce qui correspond à \begin{math}(100\times seuil)\end{math} \% de la totalité des pixels.\\ \textbf{Bruitage: }Le bruitage se fait en fonction du paramètre réel \begin{math}seuil\in[0;1]\end{math}. Il y a donc \begin{math}n = seuil\times width\times height\end{math} couples \begin{math}(x, y)\end{math} aléatoires qui sont en noir ou blanc (choix aléatoire), ce qui correspond à \begin{math}(100\times seuil)\end{math} \% de la totalité des pixels.\\\\
\textbf{Débruitage: }L'image est débruitée en fonction de deux paramètres \emph{seuil} et \emph{borne}, tout deux compris dans \begin{math}[0;255]\end{math}. Chaque pixel est traité si et seulement si il est proche du noir ou du blanc, c'est-à-dire compris dans \begin{math}[0;borne]\end{math} pour le noir et dans \begin{math}[255-borne;255]\end{math} pour le blanc. Chaque pixel traité est comparé à la couleur moyenne de ses 8 voisins, si la différence avec sa couleur est supérieure à \emph{seuil}, le pixel se voit attribuer la couleur moyenne de ses voisins. Il est à noter que si borne vaut 255, tout les pixels seront traités, de même que si seuil vaut 255, tout les pixels traités se verront affecter la couleur moyenne de leurs voisins.\\\\ \textbf{Débruitage: }L'image est débruitée en fonction de deux paramètres \emph{seuil} et \emph{borne}, tout deux compris dans \begin{math}[0;255]\end{math}. Chaque pixel est traité si et seulement si il est proche du noir ou du blanc, c'est-à-dire compris dans \begin{math}[0;borne]\end{math} pour le noir et dans \begin{math}[255-borne;255]\end{math} pour le blanc. Chaque pixel traité est comparé à la couleur moyenne de ses 8 voisins, si la différence avec sa couleur est supérieure à \emph{seuil}, le pixel se voit attribuer la couleur moyenne de ses voisins. Il est à noter que si borne vaut 255, tout les pixels seront traités, de même que si seuil vaut 255, tout les pixels traités se verront affecter la couleur moyenne de leurs voisins.\\\\
% effet 50% % effet 50%
\begin{figure}[!ht] \begin{figure}[!ht]
@ -268,17 +268,17 @@
\end{minipage} \end{minipage}
\begin{minipage}[t]{3.5cm} \begin{minipage}[t]{3.5cm}
\centering \centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/50.jpg} \includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/noisy_50.jpg}
Bruitée, seuil de 0.5 Bruitée, seuil de 0.5
\end{minipage} \end{minipage}
\begin{minipage}[t]{3.5cm} \begin{minipage}[t]{3.5cm}
\centering \centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/unset_50.jpg} \includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/algo1_50.jpg}
Débruitée sans lissage Débruitée sans lissage
\end{minipage} \end{minipage}
\begin{minipage}[t]{3.5cm} \begin{minipage}[t]{3.5cm}
\centering \centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/unset_50_liss.jpg} \includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/algo2_50.jpg}
Débruitée avec lissage Débruitée avec lissage
\end{minipage} \end{minipage}
\end{figure} \end{figure}
@ -293,31 +293,33 @@
\end{minipage} \end{minipage}
\begin{minipage}[t]{3.5cm} \begin{minipage}[t]{3.5cm}
\centering \centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/50_ZOOM.jpg} \includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/noisy_50_ZOOM.jpg}
Bruitée, seuil de 0.5 (zoom) Bruitée, seuil de 0.5 (zoom)
\end{minipage} \end{minipage}
\begin{minipage}[t]{3.5cm} \begin{minipage}[t]{3.5cm}
\centering \centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/unset_50_ZOOM.jpg} \includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/algo1_50_ZOOM.jpg}
Débruitée sans lissage (zoom) Débruitée sans lissage (zoom)
\end{minipage} \end{minipage}
\begin{minipage}[t]{3.5cm} \begin{minipage}[t]{3.5cm}
\centering \centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/unset_50_liss_ZOOM.jpg} \includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/algo2_50_ZOOM.jpg}
Débruitée avec lissage (zoom) Débruitée avec lissage (zoom)
\end{minipage} \end{minipage}
\end{figure} \end{figure}
On remarque bien ici que les contours subissent un <<effet escalier>> ce qui dégrade en majeure partie le rendu. Par contre, les couleurs sont convenablement restituées, de même pour les teintes et contrastes. Il suffirait de traiter l'image en prenant en compte les contours, ce qui permettrait de gagner en qualité. On remarque bien ici que les contours subissent un <<effet escalier>> ce qui dégrade en majeure partie le rendu. Nous avons réglé partiellement ce problème en ajoutant un lissage au processus de débruitage, mais le lissage réduit aussi la netteté de l'image. Par contre, les couleurs sont convenablement restituées, de même pour les teintes et contrastes. Il suffirait de traiter l'image en prenant en compte les contours, ce qui permettrait de gagner en qualité.
\newpage \newpage
% =================== % % =================== %
% === SECT2 - ADD === % % === SECT2 - BER === %
% =================== % % =================== %
\section{Le bruit <<Poivre et Sel>> aléatoirement réparti} \section{Le bruit additif de Bernouilli}
\textbf{Définition graphique: }L'image est parsemée de pixels ayant une teinte plus ou moins incohérente avec leurs contexte (voisinage).Ceci est une variante du <<Poivre et Sel>> où les pixels ne sont pas uniquement blancs ou noirs, mais parfois plus proches de la teinte d'origine.\\ \textbf{Définition graphique: }L'image est parsemée de pixels ayant une teinte plus ou moins incohérente avec leurs contexte (voisinage). Ceci ressemble au bruit <<Poivre et Sel>> mais les pixels ne sont pas uniquement blancs ou noirs, mais parfois plus proches de la teinte d'origine.\\\\
\textbf{Bruitage: }Le bruitage se fait en fonction du paramètre réel \begin{math}seuil\in[0;1]\end{math}. Il y a donc \begin{math}n = seuil\times width\times height\end{math} couples \begin{math}(x, y)\end{math} aléatoires qui voient leur couleur changée (choix aléatoire), ce qui correspond à \begin{math}(100\times seuil)\end{math} \% de la totalité des pixels.\\ \textbf{Bruitage: }Le bruitage se fait en fonction du paramètre réel \begin{math}seuil\in[0;1]\end{math}. Il y a donc \begin{math}n = seuil\times width\times height\end{math} couples \begin{math}(x, y)\end{math} aléatoires qui voient leur couleur changée (choix aléatoire), ce qui correspond à \begin{math}(100\times seuil)\end{math} \% de la totalité des pixels. Soit un pixel aléatoirement choisi de couleur \begin{math}c \in [0;255]\end{math}. Soit:\\
- sa teinte reste inchangée, mais il est éclairci (plus ou moins)\\
- sa teinte reste inchangée, mais il est foncé (plus ou moins)\\\\
\textbf{Débruitage \begin{math}\textbf{n}^\textbf{o}\end{math}1: }L'image est débruitée en fonction du paramètre \begin{math}seuil \in [0;255]\end{math}. Chaque pixel traité est comparé à la couleur moyenne de ses 8 voisins, si la différence avec sa couleur est supérieure à \emph{seuil}, le pixel se voit attribuer la couleur moyenne de ses voisins. Il est à noter que si seuil vaut 255, tout les pixels traités se verront affecter la couleur moyenne de leurs voisins.\\\\ \textbf{Débruitage \begin{math}\textbf{n}^\textbf{o}\end{math}1: }L'image est débruitée en fonction du paramètre \begin{math}seuil \in [0;255]\end{math}. Chaque pixel traité est comparé à la couleur moyenne de ses 8 voisins, si la différence avec sa couleur est supérieure à \emph{seuil}, le pixel se voit attribuer la couleur moyenne de ses voisins. Il est à noter que si seuil vaut 255, tout les pixels traités se verront affecter la couleur moyenne de leurs voisins.\\\\
% effet 50% % effet 50%
\begin{figure}[!ht] \begin{figure}[!ht]
@ -329,12 +331,12 @@
\end{minipage} \end{minipage}
\begin{minipage}[t]{5cm} \begin{minipage}[t]{5cm}
\centering \centering
\includegraphics[width=5cm,height=5cm]{Additive/algo1_10.jpg} \includegraphics[width=5cm,height=5cm]{Additive/noisy_30.jpg}
Bruitée, seuil de 0.1 Bruitée, seuil de 0.3
\end{minipage} \end{minipage}
\begin{minipage}[t]{5cm} \begin{minipage}[t]{5cm}
\centering \centering
\includegraphics[width=5cm,height=5cm]{Additive/unset_algo1_10.jpg} \includegraphics[width=5cm,height=5cm]{Additive/algo1_30.jpg}
Débruitée, seuil de .35 Débruitée, seuil de .35
\end{minipage} \end{minipage}
\end{figure} \end{figure}
@ -349,12 +351,12 @@
\end{minipage} \end{minipage}
\begin{minipage}[t]{5cm} \begin{minipage}[t]{5cm}
\centering \centering
\includegraphics[width=5cm,height=5cm]{Additive/algo1_10_ZOOM.jpg} \includegraphics[width=5cm,height=5cm]{Additive/noisy_30_ZOOM.jpg}
Bruitée, seuil de 0.1 (zoom) Bruitée, seuil de 0.3 (zoom)
\end{minipage} \end{minipage}
\begin{minipage}[t]{5cm} \begin{minipage}[t]{5cm}
\centering \centering
\includegraphics[width=5cm,height=5cm]{Additive/unset_algo1_10_ZOOM.jpg} \includegraphics[width=5cm,height=5cm]{Additive/algo1_30_ZOOM.jpg}
Débruitée, seuil de .35 (zoom) Débruitée, seuil de .35 (zoom)
\end{minipage} \end{minipage}
\end{figure} \end{figure}
@ -386,7 +388,7 @@
|P_{3,1}-P_{2,2}| & |P_{3,2}-P_{2,2}| & |P_{3,3}-P_{2,2}|\\ |P_{3,1}-P_{2,2}| & |P_{3,2}-P_{2,2}| & |P_{3,3}-P_{2,2}|\\
\end{pmatrix} \end{pmatrix}
\end{align*} \end{align*}
\noindent Soit \emph{m} les valeurs de \begin{math}M'_n\end{math} classées par ordre décroissant, ce qui nous permet de calculer le \textbf{poids statistique} du pixel. \noindent Soit \emph{m} les valeurs de \begin{math}M'_n\end{math} excepté \begin{math}P_{2,2}\end{math} telles que \begin{math}m_i \leq m_{i+1}\end{math}, ce qui nous permet de calculer le \textbf{poids statistique} du pixel.
\begin{align*} \begin{align*}
PS(P_{2,2}) = \sum_{i=0}^{\frac{n^2-1}{2}}{\ m_i} PS(P_{2,2}) = \sum_{i=0}^{\frac{n^2-1}{2}}{\ m_i}
\end{align*} \end{align*}
@ -403,13 +405,13 @@
\end{minipage} \end{minipage}
\begin{minipage}[t]{5cm} \begin{minipage}[t]{5cm}
\centering \centering
\includegraphics[width=5cm,height=5cm]{Additive/algo2_30.jpg} \includegraphics[width=5cm,height=5cm]{Additive/noisy_30.jpg}
Bruitée, seuil de 0.3 Bruitée, seuil de 0.3
\end{minipage} \end{minipage}
\begin{minipage}[t]{5cm} \begin{minipage}[t]{5cm}
\centering \centering
\includegraphics[width=5cm,height=5cm]{Additive/unset_algo2_30.jpg} \includegraphics[width=5cm,height=5cm]{Additive/algo2_30.jpg}
Débruitée, seuil de .09 Débruitée, seuil de .05
\end{minipage} \end{minipage}
\end{figure} \end{figure}
@ -423,16 +425,90 @@
\end{minipage} \end{minipage}
\begin{minipage}[t]{5cm} \begin{minipage}[t]{5cm}
\centering \centering
\includegraphics[width=5cm,height=5cm]{Additive/algo2_30_ZOOM.jpg} \includegraphics[width=5cm,height=5cm]{Additive/noisy_30_ZOOM.jpg}
Bruitée, seuil de 0.3 (zoom) Bruitée, seuil de 0.3 (zoom)
\end{minipage} \end{minipage}
\begin{minipage}[t]{5cm} \begin{minipage}[t]{5cm}
\centering \centering
\includegraphics[width=5cm,height=5cm]{Additive/unset_algo2_30_ZOOM.jpg} \includegraphics[width=5cm,height=5cm]{Additive/algo2_30_ZOOM.jpg}
Débruitée, seuil de .09 (zoom) Débruitée, seuil de .05 (zoom)
\end{minipage} \end{minipage}
\end{figure} \end{figure}
On remarque bien ici qu'une majorité des pixels ajoutés lors du bruitage a été proprement retirée, mais une partie reste bien visible. Celà est du au fait que les pixels considérés comme bruit se voient appliquer un filtre moyen (couleur moyenne des voisins), mais que certains voisins peuvent être eux-aussi corrompus. De plus, certains pixels corrompus ne sont pas traités du fait qu'ils ont une teinte trop proche de la moyenne voisine. Il faut noter que lors du débruitage <<Poivre et Sel>> le paramètre \emph{borne} permettait d'éviter ce problème car nous avions des références absolues : le noir et le blanc. Nous avons donc décidé d'améliorer cet algorithme de débruitage (cf. \emph{Débruitage \begin{math}n^o\end{math}2}). On remarque qu'avec cette nouvelle méthode, les contours sont moins dégradés et le bruit et d'autant plus diminué. Cet algorithme permet de différencier un contour d'un pixel bruité car la différence entre les poids statistiques écarte les deux cas.
\newpage
% =================== %
% === SECT1 - ADD === %
% =================== %
\section{Le bruit additif (Gaussien)}
\textbf{Définition graphique: }Chaque pixel de l'image est plus ou moins bruitée, l'image semble avoir moins de contraste et chaque pixel est éclairci ou foncé.\\\\
\textbf{Bruitage: }Le bruitage se fait en fonction du paramètre réel \begin{math}\sigma\in[0;255]\end{math}. Soit \emph{u} l'image d'origine, \begin{math}u^{OBS}\end{math} l'image observée et \emph{X} le bruit, on a :
\begin{align*}
u^{OBS} = u + X
\end{align*}
Afin de bruiter l'image, pour chaque pixel, on récupère un nombre réel \begin{math}r \in [0;1]\end{math} aléatoire, puis on applique la formule suivante:
\begin{align*}
u^{OBS}_{i,j} = u_{i,j} + r\sigma
\end{align*}
\textbf{Débruitage: }L'image est débruitée en fonction de deux paramètres \emph{seuil} et \emph{borne}, tout deux compris dans \begin{math}[0;255]\end{math}. Chaque pixel est traité si et seulement si il est proche du noir ou du blanc, c'est-à-dire compris dans \begin{math}[0;borne]\end{math} pour le noir et dans \begin{math}[255-borne;255]\end{math} pour le blanc. Chaque pixel traité est comparé à la couleur moyenne de ses 8 voisins, si la différence avec sa couleur est supérieure à \emph{seuil}, le pixel se voit attribuer la couleur moyenne de ses voisins. Il est à noter que si borne vaut 255, tout les pixels seront traités, de même que si seuil vaut 255, tout les pixels traités se verront affecter la couleur moyenne de leurs voisins.\\\\
% effet 50%
\begin{figure}[!ht]
\centering
\begin{minipage}[t]{3.5cm}
\centering
\includegraphics[width=3.5cm,height=3.5cm]{lena.jpg}
Image originale
\end{minipage}
\begin{minipage}[t]{3.5cm}
\centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/noisy_50.jpg}
Bruitée, seuil de 0.5
\end{minipage}
\begin{minipage}[t]{3.5cm}
\centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/algo1_50.jpg}
Débruitée sans lissage
\end{minipage}
\begin{minipage}[t]{3.5cm}
\centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/algo2_50.jpg}
Débruitée avec lissage
\end{minipage}
\end{figure}
% effet 50% (zoom)
\begin{figure}[!ht]
\centering
\begin{minipage}[t]{3.5cm}
\centering
\includegraphics[width=3.5cm,height=3.5cm]{lenaZOOM.jpg}
Image originale (zoom)
\end{minipage}
\begin{minipage}[t]{3.5cm}
\centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/noisy_50_ZOOM.jpg}
Bruitée, seuil de 0.5 (zoom)
\end{minipage}
\begin{minipage}[t]{3.5cm}
\centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/algo1_50_ZOOM.jpg}
Débruitée sans lissage (zoom)
\end{minipage}
\begin{minipage}[t]{3.5cm}
\centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/algo2_50_ZOOM.jpg}
Débruitée avec lissage (zoom)
\end{minipage}
\end{figure}
On remarque bien ici que les contours subissent un <<effet escalier>> ce qui dégrade en majeure partie le rendu. Par contre, les couleurs sont convenablement restituées, de même pour les teintes et contrastes. Il suffirait de traiter l'image en prenant en compte les contours, ce qui permettrait de gagner en qualité.
\newpage
\end{document} \end{document}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 KiB

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 157 KiB

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

Before

Width:  |  Height:  |  Size: 136 KiB

After

Width:  |  Height:  |  Size: 136 KiB

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 187 KiB

After

Width:  |  Height:  |  Size: 187 KiB

View File

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

View File

@ -255,8 +255,8 @@
% === SECT1 - P&S === % % === SECT1 - P&S === %
% =================== % % =================== %
\section{Le bruit de type <<Poivre \& Sel>>} \section{Le bruit de type <<Poivre \& Sel>>}
\textbf{Définition graphique: }L'image est parsemée de pixels ayant une teinte extrême (blancs ou noirs) sans rapport avec leur contexte (voisinage).\\ \textbf{Définition graphique: }L'image est parsemée de pixels ayant une teinte extrême (blancs ou noirs) sans rapport avec leur contexte (voisinage).\\\\
\textbf{Bruitage: }Le bruitage se fait en fonction du paramètre réel \begin{math}seuil\in[0;1]\end{math}. Il y a donc \begin{math}n = seuil\times width\times height\end{math} couples \begin{math}(x, y)\end{math} aléatoires qui sont en noir ou blanc (choix aléatoire), ce qui correspond à \begin{math}(100\times seuil)\end{math} \% de la totalité des pixels.\\ \textbf{Bruitage: }Le bruitage se fait en fonction du paramètre réel \begin{math}seuil\in[0;1]\end{math}. Il y a donc \begin{math}n = seuil\times width\times height\end{math} couples \begin{math}(x, y)\end{math} aléatoires qui sont en noir ou blanc (choix aléatoire), ce qui correspond à \begin{math}(100\times seuil)\end{math} \% de la totalité des pixels.\\\\
\textbf{Débruitage: }L'image est débruitée en fonction de deux paramètres \emph{seuil} et \emph{borne}, tout deux compris dans \begin{math}[0;255]\end{math}. Chaque pixel est traité si et seulement si il est proche du noir ou du blanc, c'est-à-dire compris dans \begin{math}[0;borne]\end{math} pour le noir et dans \begin{math}[255-borne;255]\end{math} pour le blanc. Chaque pixel traité est comparé à la couleur moyenne de ses 8 voisins, si la différence avec sa couleur est supérieure à \emph{seuil}, le pixel se voit attribuer la couleur moyenne de ses voisins. Il est à noter que si borne vaut 255, tout les pixels seront traités, de même que si seuil vaut 255, tout les pixels traités se verront affecter la couleur moyenne de leurs voisins.\\\\ \textbf{Débruitage: }L'image est débruitée en fonction de deux paramètres \emph{seuil} et \emph{borne}, tout deux compris dans \begin{math}[0;255]\end{math}. Chaque pixel est traité si et seulement si il est proche du noir ou du blanc, c'est-à-dire compris dans \begin{math}[0;borne]\end{math} pour le noir et dans \begin{math}[255-borne;255]\end{math} pour le blanc. Chaque pixel traité est comparé à la couleur moyenne de ses 8 voisins, si la différence avec sa couleur est supérieure à \emph{seuil}, le pixel se voit attribuer la couleur moyenne de ses voisins. Il est à noter que si borne vaut 255, tout les pixels seront traités, de même que si seuil vaut 255, tout les pixels traités se verront affecter la couleur moyenne de leurs voisins.\\\\
% effet 50% % effet 50%
\begin{figure}[!ht] \begin{figure}[!ht]
@ -268,17 +268,17 @@
\end{minipage} \end{minipage}
\begin{minipage}[t]{3.5cm} \begin{minipage}[t]{3.5cm}
\centering \centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/50.jpg} \includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/noisy_50.jpg}
Bruitée, seuil de 0.5 Bruitée, seuil de 0.5
\end{minipage} \end{minipage}
\begin{minipage}[t]{3.5cm} \begin{minipage}[t]{3.5cm}
\centering \centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/unset_50.jpg} \includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/algo1_50.jpg}
Débruitée sans lissage Débruitée sans lissage
\end{minipage} \end{minipage}
\begin{minipage}[t]{3.5cm} \begin{minipage}[t]{3.5cm}
\centering \centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/unset_50_liss.jpg} \includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/algo2_50.jpg}
Débruitée avec lissage Débruitée avec lissage
\end{minipage} \end{minipage}
\end{figure} \end{figure}
@ -293,31 +293,33 @@
\end{minipage} \end{minipage}
\begin{minipage}[t]{3.5cm} \begin{minipage}[t]{3.5cm}
\centering \centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/50_ZOOM.jpg} \includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/noisy_50_ZOOM.jpg}
Bruitée, seuil de 0.5 (zoom) Bruitée, seuil de 0.5 (zoom)
\end{minipage} \end{minipage}
\begin{minipage}[t]{3.5cm} \begin{minipage}[t]{3.5cm}
\centering \centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/unset_50_ZOOM.jpg} \includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/algo1_50_ZOOM.jpg}
Débruitée sans lissage (zoom) Débruitée sans lissage (zoom)
\end{minipage} \end{minipage}
\begin{minipage}[t]{3.5cm} \begin{minipage}[t]{3.5cm}
\centering \centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/unset_50_liss_ZOOM.jpg} \includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/algo2_50_ZOOM.jpg}
Débruitée avec lissage (zoom) Débruitée avec lissage (zoom)
\end{minipage} \end{minipage}
\end{figure} \end{figure}
On remarque bien ici que les contours subissent un <<effet escalier>> ce qui dégrade en majeure partie le rendu. Par contre, les couleurs sont convenablement restituées, de même pour les teintes et contrastes. Il suffirait de traiter l'image en prenant en compte les contours, ce qui permettrait de gagner en qualité. On remarque bien ici que les contours subissent un <<effet escalier>> ce qui dégrade en majeure partie le rendu. Nous avons réglé partiellement ce problème en ajoutant un lissage au processus de débruitage, mais le lissage réduit aussi la netteté de l'image. Par contre, les couleurs sont convenablement restituées, de même pour les teintes et contrastes. Il suffirait de traiter l'image en prenant en compte les contours, ce qui permettrait de gagner en qualité.
\newpage \newpage
% =================== % % =================== %
% === SECT2 - ADD === % % === SECT2 - BER === %
% =================== % % =================== %
\section{Le bruit <<Poivre et Sel>> aléatoirement réparti} \section{Le bruit additif de Bernouilli}
\textbf{Définition graphique: }L'image est parsemée de pixels ayant une teinte plus ou moins incohérente avec leurs contexte (voisinage).Ceci est une variante du <<Poivre et Sel>> où les pixels ne sont pas uniquement blancs ou noirs, mais parfois plus proches de la teinte d'origine.\\ \textbf{Définition graphique: }L'image est parsemée de pixels ayant une teinte plus ou moins incohérente avec leurs contexte (voisinage). Ceci ressemble au bruit <<Poivre et Sel>> mais les pixels ne sont pas uniquement blancs ou noirs, mais parfois plus proches de la teinte d'origine.\\\\
\textbf{Bruitage: }Le bruitage se fait en fonction du paramètre réel \begin{math}seuil\in[0;1]\end{math}. Il y a donc \begin{math}n = seuil\times width\times height\end{math} couples \begin{math}(x, y)\end{math} aléatoires qui voient leur couleur changée (choix aléatoire), ce qui correspond à \begin{math}(100\times seuil)\end{math} \% de la totalité des pixels.\\ \textbf{Bruitage: }Le bruitage se fait en fonction du paramètre réel \begin{math}seuil\in[0;1]\end{math}. Il y a donc \begin{math}n = seuil\times width\times height\end{math} couples \begin{math}(x, y)\end{math} aléatoires qui voient leur couleur changée (choix aléatoire), ce qui correspond à \begin{math}(100\times seuil)\end{math} \% de la totalité des pixels. Soit un pixel aléatoirement choisi de couleur \begin{math}c \in [0;255]\end{math}. Soit:\\
- sa teinte reste inchangée, mais il est éclairci (plus ou moins)\\
- sa teinte reste inchangée, mais il est foncé (plus ou moins)\\\\
\textbf{Débruitage \begin{math}\textbf{n}^\textbf{o}\end{math}1: }L'image est débruitée en fonction du paramètre \begin{math}seuil \in [0;255]\end{math}. Chaque pixel traité est comparé à la couleur moyenne de ses 8 voisins, si la différence avec sa couleur est supérieure à \emph{seuil}, le pixel se voit attribuer la couleur moyenne de ses voisins. Il est à noter que si seuil vaut 255, tout les pixels traités se verront affecter la couleur moyenne de leurs voisins.\\\\ \textbf{Débruitage \begin{math}\textbf{n}^\textbf{o}\end{math}1: }L'image est débruitée en fonction du paramètre \begin{math}seuil \in [0;255]\end{math}. Chaque pixel traité est comparé à la couleur moyenne de ses 8 voisins, si la différence avec sa couleur est supérieure à \emph{seuil}, le pixel se voit attribuer la couleur moyenne de ses voisins. Il est à noter que si seuil vaut 255, tout les pixels traités se verront affecter la couleur moyenne de leurs voisins.\\\\
% effet 50% % effet 50%
\begin{figure}[!ht] \begin{figure}[!ht]
@ -329,12 +331,12 @@
\end{minipage} \end{minipage}
\begin{minipage}[t]{5cm} \begin{minipage}[t]{5cm}
\centering \centering
\includegraphics[width=5cm,height=5cm]{Additive/algo1_10.jpg} \includegraphics[width=5cm,height=5cm]{Additive/noisy_30.jpg}
Bruitée, seuil de 0.1 Bruitée, seuil de 0.3
\end{minipage} \end{minipage}
\begin{minipage}[t]{5cm} \begin{minipage}[t]{5cm}
\centering \centering
\includegraphics[width=5cm,height=5cm]{Additive/unset_algo1_10.jpg} \includegraphics[width=5cm,height=5cm]{Additive/algo1_30.jpg}
Débruitée, seuil de .35 Débruitée, seuil de .35
\end{minipage} \end{minipage}
\end{figure} \end{figure}
@ -349,12 +351,12 @@
\end{minipage} \end{minipage}
\begin{minipage}[t]{5cm} \begin{minipage}[t]{5cm}
\centering \centering
\includegraphics[width=5cm,height=5cm]{Additive/algo1_10_ZOOM.jpg} \includegraphics[width=5cm,height=5cm]{Additive/noisy_30_ZOOM.jpg}
Bruitée, seuil de 0.1 (zoom) Bruitée, seuil de 0.3 (zoom)
\end{minipage} \end{minipage}
\begin{minipage}[t]{5cm} \begin{minipage}[t]{5cm}
\centering \centering
\includegraphics[width=5cm,height=5cm]{Additive/unset_algo1_10_ZOOM.jpg} \includegraphics[width=5cm,height=5cm]{Additive/algo1_30_ZOOM.jpg}
Débruitée, seuil de .35 (zoom) Débruitée, seuil de .35 (zoom)
\end{minipage} \end{minipage}
\end{figure} \end{figure}
@ -386,7 +388,7 @@
|P_{3,1}-P_{2,2}| & |P_{3,2}-P_{2,2}| & |P_{3,3}-P_{2,2}|\\ |P_{3,1}-P_{2,2}| & |P_{3,2}-P_{2,2}| & |P_{3,3}-P_{2,2}|\\
\end{pmatrix} \end{pmatrix}
\end{align*} \end{align*}
\noindent Soit \emph{m} les valeurs de \begin{math}M'_n\end{math} classées par ordre décroissant, ce qui nous permet de calculer le \textbf{poids statistique} du pixel. \noindent Soit \emph{m} les valeurs de \begin{math}M'_n\end{math} excepté \begin{math}P_{2,2}\end{math} telles que \begin{math}m_i \leq m_{i+1}\end{math}, ce qui nous permet de calculer le \textbf{poids statistique} du pixel.
\begin{align*} \begin{align*}
PS(P_{2,2}) = \sum_{i=0}^{\frac{n^2-1}{2}}{\ m_i} PS(P_{2,2}) = \sum_{i=0}^{\frac{n^2-1}{2}}{\ m_i}
\end{align*} \end{align*}
@ -403,13 +405,13 @@
\end{minipage} \end{minipage}
\begin{minipage}[t]{5cm} \begin{minipage}[t]{5cm}
\centering \centering
\includegraphics[width=5cm,height=5cm]{Additive/algo2_30.jpg} \includegraphics[width=5cm,height=5cm]{Additive/noisy_30.jpg}
Bruitée, seuil de 0.3 Bruitée, seuil de 0.3
\end{minipage} \end{minipage}
\begin{minipage}[t]{5cm} \begin{minipage}[t]{5cm}
\centering \centering
\includegraphics[width=5cm,height=5cm]{Additive/unset_algo2_30.jpg} \includegraphics[width=5cm,height=5cm]{Additive/algo2_30.jpg}
Débruitée, seuil de .09 Débruitée, seuil de .05
\end{minipage} \end{minipage}
\end{figure} \end{figure}
@ -423,16 +425,90 @@
\end{minipage} \end{minipage}
\begin{minipage}[t]{5cm} \begin{minipage}[t]{5cm}
\centering \centering
\includegraphics[width=5cm,height=5cm]{Additive/algo2_30_ZOOM.jpg} \includegraphics[width=5cm,height=5cm]{Additive/noisy_30_ZOOM.jpg}
Bruitée, seuil de 0.3 (zoom) Bruitée, seuil de 0.3 (zoom)
\end{minipage} \end{minipage}
\begin{minipage}[t]{5cm} \begin{minipage}[t]{5cm}
\centering \centering
\includegraphics[width=5cm,height=5cm]{Additive/unset_algo2_30_ZOOM.jpg} \includegraphics[width=5cm,height=5cm]{Additive/algo2_30_ZOOM.jpg}
Débruitée, seuil de .09 (zoom) Débruitée, seuil de .05 (zoom)
\end{minipage} \end{minipage}
\end{figure} \end{figure}
On remarque bien ici qu'une majorité des pixels ajoutés lors du bruitage a été proprement retirée, mais une partie reste bien visible. Celà est du au fait que les pixels considérés comme bruit se voient appliquer un filtre moyen (couleur moyenne des voisins), mais que certains voisins peuvent être eux-aussi corrompus. De plus, certains pixels corrompus ne sont pas traités du fait qu'ils ont une teinte trop proche de la moyenne voisine. Il faut noter que lors du débruitage <<Poivre et Sel>> le paramètre \emph{borne} permettait d'éviter ce problème car nous avions des références absolues : le noir et le blanc. Nous avons donc décidé d'améliorer cet algorithme de débruitage (cf. \emph{Débruitage \begin{math}n^o\end{math}2}). On remarque qu'avec cette nouvelle méthode, les contours sont moins dégradés et le bruit et d'autant plus diminué. Cet algorithme permet de différencier un contour d'un pixel bruité car la différence entre les poids statistiques écarte les deux cas.
\newpage
% =================== %
% === SECT1 - ADD === %
% =================== %
\section{Le bruit additif (Gaussien)}
\textbf{Définition graphique: }Chaque pixel de l'image est plus ou moins bruitée, l'image semble avoir moins de contraste et chaque pixel est éclairci ou foncé.\\\\
\textbf{Bruitage: }Le bruitage se fait en fonction du paramètre réel \begin{math}\sigma\in[0;255]\end{math}. Soit \emph{u} l'image d'origine, \begin{math}u^{OBS}\end{math} l'image observée et \emph{X} le bruit, on a :
\begin{align*}
u^{OBS} = u + X
\end{align*}
Afin de bruiter l'image, pour chaque pixel, on récupère un nombre réel \begin{math}r \in [0;1]\end{math} aléatoire, puis on applique la formule suivante:
\begin{align*}
u^{OBS}_{i,j} = u_{i,j} + r\sigma
\end{align*}
\textbf{Débruitage: }L'image est débruitée en fonction de deux paramètres \emph{seuil} et \emph{borne}, tout deux compris dans \begin{math}[0;255]\end{math}. Chaque pixel est traité si et seulement si il est proche du noir ou du blanc, c'est-à-dire compris dans \begin{math}[0;borne]\end{math} pour le noir et dans \begin{math}[255-borne;255]\end{math} pour le blanc. Chaque pixel traité est comparé à la couleur moyenne de ses 8 voisins, si la différence avec sa couleur est supérieure à \emph{seuil}, le pixel se voit attribuer la couleur moyenne de ses voisins. Il est à noter que si borne vaut 255, tout les pixels seront traités, de même que si seuil vaut 255, tout les pixels traités se verront affecter la couleur moyenne de leurs voisins.\\\\
% effet 50%
\begin{figure}[!ht]
\centering
\begin{minipage}[t]{3.5cm}
\centering
\includegraphics[width=3.5cm,height=3.5cm]{lena.jpg}
Image originale
\end{minipage}
\begin{minipage}[t]{3.5cm}
\centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/noisy_50.jpg}
Bruitée, seuil de 0.5
\end{minipage}
\begin{minipage}[t]{3.5cm}
\centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/algo1_50.jpg}
Débruitée sans lissage
\end{minipage}
\begin{minipage}[t]{3.5cm}
\centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/algo2_50.jpg}
Débruitée avec lissage
\end{minipage}
\end{figure}
% effet 50% (zoom)
\begin{figure}[!ht]
\centering
\begin{minipage}[t]{3.5cm}
\centering
\includegraphics[width=3.5cm,height=3.5cm]{lenaZOOM.jpg}
Image originale (zoom)
\end{minipage}
\begin{minipage}[t]{3.5cm}
\centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/noisy_50_ZOOM.jpg}
Bruitée, seuil de 0.5 (zoom)
\end{minipage}
\begin{minipage}[t]{3.5cm}
\centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/algo1_50_ZOOM.jpg}
Débruitée sans lissage (zoom)
\end{minipage}
\begin{minipage}[t]{3.5cm}
\centering
\includegraphics[width=3.5cm,height=3.5cm]{SaltAndPepper/algo2_50_ZOOM.jpg}
Débruitée avec lissage (zoom)
\end{minipage}
\end{figure}
On remarque bien ici que les contours subissent un <<effet escalier>> ce qui dégrade en majeure partie le rendu. Par contre, les couleurs sont convenablement restituées, de même pour les teintes et contrastes. Il suffirait de traiter l'image en prenant en compte les contours, ce qui permettrait de gagner en qualité.
\newpage
\end{document} \end{document}

4
gaussian_additive Normal file
View File

@ -0,0 +1,4 @@
uOBS(i,j) = u(i,j) + sigma * n(i,j)
n = random(0,1)
SNR = 10.log[10] P(U) / P(U-Uref)