diff --git a/code/AdditiveGaussian.bmp b/code/AdditiveGaussian.bmp new file mode 100644 index 0000000..95bc3b4 Binary files /dev/null and b/code/AdditiveGaussian.bmp differ diff --git a/code/SaltAndPepper.bmp b/code/SaltAndPepper.bmp deleted file mode 100644 index 84576c7..0000000 Binary files a/code/SaltAndPepper.bmp and /dev/null differ diff --git a/code/main.py b/code/main.py index 46aa917..ba2d578 100644 --- a/code/main.py +++ b/code/main.py @@ -36,7 +36,8 @@ print "+---------------------------+" print "| %s |" % exactLength("TESTS DE BRUIT", 25, 0) print "| %s |" % exactLength("", 25, 0) 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 "| %s |" % exactLength("TESTS DE DIFFERENCES", 25, 0) print "| %s |" % exactLength("", 25, 0) @@ -118,7 +119,17 @@ elif action == 11: if outS != "": arg2 = int(outS) 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 elif action == 20: print startStr diff --git a/code/new.bmp b/code/new.bmp index 580e6c6..95bc3b4 100644 Binary files a/code/new.bmp and b/code/new.bmp differ diff --git a/code/tests.py b/code/tests.py index 9495d43..9f366e6 100644 --- a/code/tests.py +++ b/code/tests.py @@ -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 # @stsarg 2 le fichier de sortie (bruité PUIS débruité) # -# @file SaltAndPepper.bmp le fichier 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 testAdditiveNoise(seuilA=10, seuilB=35): +def testAdditiveBernouilliNoise(seuilA=10, seuilB=35): t = Timer(); @@ -322,7 +322,7 @@ def testAdditiveNoise(seuilA=10, seuilB=35): 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()) # Unparsing @@ -332,7 +332,7 @@ def testAdditiveNoise(seuilA=10, seuilB=35): # image to stdout print "| Writing file |",; t.reset(); - img.write( "AdditiveNoise.bmp" ) + img.write( "AdditiveBernouilli.bmp" ) 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()) + + + + + + + + + + + diff --git a/code/utility/Additive_Noise.py b/code/utility/Additive_Noise.py index 23c994e..0b7c50f 100644 --- a/code/utility/Additive_Noise.py +++ b/code/utility/Additive_Noise.py @@ -9,12 +9,12 @@ from BMPFile import RGBPixel 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 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); while seuil >= 1: @@ -41,6 +41,48 @@ class Additive_Noise: 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 # ##################################################################### # @param pixelMap Matrice de pixel à traiter (modifier) diff --git a/dossier/.dossier.tex.swp b/dossier/.dossier.tex.swp index 3f78c09..c19caf2 100644 --- a/dossier/.dossier.tex.swp +++ b/dossier/.dossier.tex.swp @@ -255,8 +255,8 @@ % === SECT1 - P&S === % % =================== % \section{Le bruit de type <>} - \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{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{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] @@ -268,17 +268,17 @@ \end{minipage} \begin{minipage}[t]{3.5cm} \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 \end{minipage} \begin{minipage}[t]{3.5cm} \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 \end{minipage} \begin{minipage}[t]{3.5cm} \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 \end{minipage} \end{figure} @@ -293,31 +293,33 @@ \end{minipage} \begin{minipage}[t]{3.5cm} \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) \end{minipage} \begin{minipage}[t]{3.5cm} \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) \end{minipage} \begin{minipage}[t]{3.5cm} \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) \end{minipage} \end{figure} - On remarque bien ici que les contours subissent un <> 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 <> 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 % =================== % - % === SECT2 - ADD === % + % === SECT2 - BER === % % =================== % - \section{Le bruit <> aléatoirement réparti} - \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 <> où 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.\\ + \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 ressemble au bruit <> 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. 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.\\\\ % effet 50% \begin{figure}[!ht] @@ -329,12 +331,12 @@ \end{minipage} \begin{minipage}[t]{5cm} \centering - \includegraphics[width=5cm,height=5cm]{Additive/algo1_10.jpg} - Bruitée, seuil de 0.1 + \includegraphics[width=5cm,height=5cm]{Additive/noisy_30.jpg} + Bruitée, seuil de 0.3 \end{minipage} \begin{minipage}[t]{5cm} \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 \end{minipage} \end{figure} @@ -349,12 +351,12 @@ \end{minipage} \begin{minipage}[t]{5cm} \centering - \includegraphics[width=5cm,height=5cm]{Additive/algo1_10_ZOOM.jpg} - Bruitée, seuil de 0.1 (zoom) + \includegraphics[width=5cm,height=5cm]{Additive/noisy_30_ZOOM.jpg} + Bruitée, seuil de 0.3 (zoom) \end{minipage} \begin{minipage}[t]{5cm} \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) \end{minipage} \end{figure} @@ -386,7 +388,7 @@ |P_{3,1}-P_{2,2}| & |P_{3,2}-P_{2,2}| & |P_{3,3}-P_{2,2}|\\ \end{pmatrix} \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*} PS(P_{2,2}) = \sum_{i=0}^{\frac{n^2-1}{2}}{\ m_i} \end{align*} @@ -403,13 +405,13 @@ \end{minipage} \begin{minipage}[t]{5cm} \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 \end{minipage} \begin{minipage}[t]{5cm} \centering - \includegraphics[width=5cm,height=5cm]{Additive/unset_algo2_30.jpg} - Débruitée, seuil de .09 + \includegraphics[width=5cm,height=5cm]{Additive/algo2_30.jpg} + Débruitée, seuil de .05 \end{minipage} \end{figure} @@ -423,16 +425,90 @@ \end{minipage} \begin{minipage}[t]{5cm} \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) \end{minipage} \begin{minipage}[t]{5cm} \centering - \includegraphics[width=5cm,height=5cm]{Additive/unset_algo2_30_ZOOM.jpg} - Débruitée, seuil de .09 (zoom) + \includegraphics[width=5cm,height=5cm]{Additive/algo2_30_ZOOM.jpg} + Débruitée, seuil de .05 (zoom) \end{minipage} \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 <> 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 <> 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} \ No newline at end of file diff --git a/dossier/Additive/algo1_10.jpg b/dossier/Additive/algo1_10.jpg deleted file mode 100644 index e1560e4..0000000 Binary files a/dossier/Additive/algo1_10.jpg and /dev/null differ diff --git a/dossier/Additive/algo1_10_ZOOM.jpg b/dossier/Additive/algo1_10_ZOOM.jpg deleted file mode 100644 index a04ecf2..0000000 Binary files a/dossier/Additive/algo1_10_ZOOM.jpg and /dev/null differ diff --git a/dossier/Additive/algo1_30.jpg b/dossier/Additive/algo1_30.jpg new file mode 100644 index 0000000..56f60e8 Binary files /dev/null and b/dossier/Additive/algo1_30.jpg differ diff --git a/dossier/Additive/algo1_30_ZOOM.jpg b/dossier/Additive/algo1_30_ZOOM.jpg new file mode 100644 index 0000000..82c8a66 Binary files /dev/null and b/dossier/Additive/algo1_30_ZOOM.jpg differ diff --git a/dossier/Additive/algo2_30.jpg b/dossier/Additive/algo2_30.jpg index 6f82ca2..089d2fd 100644 Binary files a/dossier/Additive/algo2_30.jpg and b/dossier/Additive/algo2_30.jpg differ diff --git a/dossier/Additive/algo2_30_ZOOM.jpg b/dossier/Additive/algo2_30_ZOOM.jpg index 15d40d6..dd03996 100644 Binary files a/dossier/Additive/algo2_30_ZOOM.jpg and b/dossier/Additive/algo2_30_ZOOM.jpg differ diff --git a/dossier/Additive/noisy_30.jpg b/dossier/Additive/noisy_30.jpg new file mode 100644 index 0000000..af033bd Binary files /dev/null and b/dossier/Additive/noisy_30.jpg differ diff --git a/dossier/Additive/noisy_30_ZOOM.jpg b/dossier/Additive/noisy_30_ZOOM.jpg new file mode 100644 index 0000000..20ce40a Binary files /dev/null and b/dossier/Additive/noisy_30_ZOOM.jpg differ diff --git a/dossier/Additive/unset_algo1_10.jpg b/dossier/Additive/unset_algo1_10.jpg deleted file mode 100644 index a0e87c8..0000000 Binary files a/dossier/Additive/unset_algo1_10.jpg and /dev/null differ diff --git a/dossier/Additive/unset_algo1_10_ZOOM.jpg b/dossier/Additive/unset_algo1_10_ZOOM.jpg deleted file mode 100644 index cfeeb24..0000000 Binary files a/dossier/Additive/unset_algo1_10_ZOOM.jpg and /dev/null differ diff --git a/dossier/Additive/unset_algo2_30.jpg b/dossier/Additive/unset_algo2_30.jpg deleted file mode 100644 index a79d5e4..0000000 Binary files a/dossier/Additive/unset_algo2_30.jpg and /dev/null differ diff --git a/dossier/Additive/unset_algo2_30_ZOOM.jpg b/dossier/Additive/unset_algo2_30_ZOOM.jpg deleted file mode 100644 index 65d5123..0000000 Binary files a/dossier/Additive/unset_algo2_30_ZOOM.jpg and /dev/null differ diff --git a/dossier/SaltAndPepper/unset_50.jpg b/dossier/SaltAndPepper/algo1_50.jpg similarity index 100% rename from dossier/SaltAndPepper/unset_50.jpg rename to dossier/SaltAndPepper/algo1_50.jpg diff --git a/dossier/SaltAndPepper/unset_50_ZOOM.jpg b/dossier/SaltAndPepper/algo1_50_ZOOM.jpg similarity index 100% rename from dossier/SaltAndPepper/unset_50_ZOOM.jpg rename to dossier/SaltAndPepper/algo1_50_ZOOM.jpg diff --git a/dossier/SaltAndPepper/unset_50_liss.jpg b/dossier/SaltAndPepper/algo2_50.jpg similarity index 100% rename from dossier/SaltAndPepper/unset_50_liss.jpg rename to dossier/SaltAndPepper/algo2_50.jpg diff --git a/dossier/SaltAndPepper/unset_50_liss_ZOOM.jpg b/dossier/SaltAndPepper/algo2_50_ZOOM.jpg similarity index 100% rename from dossier/SaltAndPepper/unset_50_liss_ZOOM.jpg rename to dossier/SaltAndPepper/algo2_50_ZOOM.jpg diff --git a/dossier/SaltAndPepper/50.jpg b/dossier/SaltAndPepper/noisy_50.jpg similarity index 100% rename from dossier/SaltAndPepper/50.jpg rename to dossier/SaltAndPepper/noisy_50.jpg diff --git a/dossier/SaltAndPepper/50_ZOOM.jpg b/dossier/SaltAndPepper/noisy_50_ZOOM.jpg similarity index 100% rename from dossier/SaltAndPepper/50_ZOOM.jpg rename to dossier/SaltAndPepper/noisy_50_ZOOM.jpg diff --git a/dossier/dossier.pdf b/dossier/dossier.pdf index 4ec4e17..d38bb26 100644 Binary files a/dossier/dossier.pdf and b/dossier/dossier.pdf differ diff --git a/dossier/dossier.tex b/dossier/dossier.tex index 3f78c09..c19caf2 100644 --- a/dossier/dossier.tex +++ b/dossier/dossier.tex @@ -255,8 +255,8 @@ % === SECT1 - P&S === % % =================== % \section{Le bruit de type <>} - \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{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{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] @@ -268,17 +268,17 @@ \end{minipage} \begin{minipage}[t]{3.5cm} \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 \end{minipage} \begin{minipage}[t]{3.5cm} \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 \end{minipage} \begin{minipage}[t]{3.5cm} \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 \end{minipage} \end{figure} @@ -293,31 +293,33 @@ \end{minipage} \begin{minipage}[t]{3.5cm} \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) \end{minipage} \begin{minipage}[t]{3.5cm} \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) \end{minipage} \begin{minipage}[t]{3.5cm} \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) \end{minipage} \end{figure} - On remarque bien ici que les contours subissent un <> 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 <> 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 % =================== % - % === SECT2 - ADD === % + % === SECT2 - BER === % % =================== % - \section{Le bruit <> aléatoirement réparti} - \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 <> où 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.\\ + \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 ressemble au bruit <> 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. 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.\\\\ % effet 50% \begin{figure}[!ht] @@ -329,12 +331,12 @@ \end{minipage} \begin{minipage}[t]{5cm} \centering - \includegraphics[width=5cm,height=5cm]{Additive/algo1_10.jpg} - Bruitée, seuil de 0.1 + \includegraphics[width=5cm,height=5cm]{Additive/noisy_30.jpg} + Bruitée, seuil de 0.3 \end{minipage} \begin{minipage}[t]{5cm} \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 \end{minipage} \end{figure} @@ -349,12 +351,12 @@ \end{minipage} \begin{minipage}[t]{5cm} \centering - \includegraphics[width=5cm,height=5cm]{Additive/algo1_10_ZOOM.jpg} - Bruitée, seuil de 0.1 (zoom) + \includegraphics[width=5cm,height=5cm]{Additive/noisy_30_ZOOM.jpg} + Bruitée, seuil de 0.3 (zoom) \end{minipage} \begin{minipage}[t]{5cm} \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) \end{minipage} \end{figure} @@ -386,7 +388,7 @@ |P_{3,1}-P_{2,2}| & |P_{3,2}-P_{2,2}| & |P_{3,3}-P_{2,2}|\\ \end{pmatrix} \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*} PS(P_{2,2}) = \sum_{i=0}^{\frac{n^2-1}{2}}{\ m_i} \end{align*} @@ -403,13 +405,13 @@ \end{minipage} \begin{minipage}[t]{5cm} \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 \end{minipage} \begin{minipage}[t]{5cm} \centering - \includegraphics[width=5cm,height=5cm]{Additive/unset_algo2_30.jpg} - Débruitée, seuil de .09 + \includegraphics[width=5cm,height=5cm]{Additive/algo2_30.jpg} + Débruitée, seuil de .05 \end{minipage} \end{figure} @@ -423,16 +425,90 @@ \end{minipage} \begin{minipage}[t]{5cm} \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) \end{minipage} \begin{minipage}[t]{5cm} \centering - \includegraphics[width=5cm,height=5cm]{Additive/unset_algo2_30_ZOOM.jpg} - Débruitée, seuil de .09 (zoom) + \includegraphics[width=5cm,height=5cm]{Additive/algo2_30_ZOOM.jpg} + Débruitée, seuil de .05 (zoom) \end{minipage} \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 <> 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 <> 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} \ No newline at end of file diff --git a/gaussian_additive b/gaussian_additive new file mode 100644 index 0000000..4fe6b98 --- /dev/null +++ b/gaussian_additive @@ -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)