Convolution fonctionelle git add --all!

This commit is contained in:
xdrm-brackets 2015-09-29 11:32:24 +02:00
parent cd470bebae
commit 51a42d0e34
7 changed files with 602 additions and 801 deletions

BIN
code/smooth.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

BIN
code/smooth2.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

View File

@ -13,279 +13,24 @@ class Filter:
# @param pixelMap Matrice de pixel à traiter (modifier)
# @param seuil Ecart entre le pixel et ses alentours à partir duquel on applique le lissage
#
def smooth(self, pixelMap, seuil=5):
def smooth(self, pixelMap, seuil=0):
width = len( pixelMap[0] )
height = len( pixelMap )
if seuil < 0 or seuil > 255: # si le seuil est incohérent => valeur par défaut (5)
seuil = 5;
a = int( seuil )
while a >= 100:
a /= 100;
kernel = [
[a, a, a],
[a, 0, a],
[a, a, a],
]
pixelMap = self.Convolution(pixelMap, kernel)
# on parcourt tout les pixels
for y in range(0, len(pixelMap)):
for x in range(0, len(pixelMap[y])):
# on calcule la moyenne des valeurs R G B du pixel courant
pMoy = ( pixelMap[y][x].r + pixelMap[y][x].g + pixelMap[y][x].b ) / 3
xmin, ymin, xmax, ymap = x, y, x, y; # les bornes ducarré 3x3 autour du pixel
rMoy, gMoy, bMoy, count = 0.0, 0.0, 0.0, 0 # initialisation des variables de moyennes et de total
rInterval, gInterval, bInterval, rgbInterval = 0, 0, 0, 0 # initialisation des variables d'intervalles entre les couleurs
# GESTION DES ANGLES
# ordonnées: borne inférieure
if y-1 > -1:
ymin = y-1
# ordonnées: borne supérieure
if y+1 < height:
ymax = y+1
# abscisses: borne inférieure
if x-1 > -1:
xmin = x-1
# abscisses: borne supérieure
if x+1 < width:
xmax = x+1
pixels = [ pixelMap[y][xmin], pixelMap[y][xmax], pixelMap[ymin][x], pixelMap[ymax][x] ];
for p in pixels:
if p != pixelMap[y][x]:
rMoy += p.r;
gMoy += p.g;
bMoy += p.b;
count += 1
# si il y a au moins un pixel autour (normalement tjs mais évite l'erreur div par zéro)
if count > 0:
# on calcule les moyennes somme(xi) / n
rMoy = int( rMoy / count )
gMoy = int( gMoy / count )
bMoy = int( bMoy / count )
# calcul de la différence entre les couleurs du pixel et la moyenne des couleurs des pixels autour
rInterval = abs( pixelMap[y][x].r - rMoy )
gInterval = abs( pixelMap[y][x].g - gMoy )
bInterval = abs( pixelMap[y][x].b - bMoy )
# calcul de la différence en nuance de gris (moyenne des couleurs)
rgbInterval = ( rInterval + gInterval + bInterval ) / 3
# si la couleur est trop "différente" (dépend du seuil) alors on remplace sa couleur par la moyenne des couleurs alentours
if rgbInterval > seuil:
pixelMap[y][x].setRGB(rMoy, gMoy, bMoy);
# applique le filtre de "Laplace" sur l'image #
###############################################
# @param pixelMap la matrice de pixels à modifier
#
# @history
# applique le filtre
#
# -1 -1 -1
#
# 1/8 * -1 8 -1
#
# -1 -1 -1
def Laplace(self, pixelMap):
# on parcourt tout les pixels
for y in range(1, len(pixelMap)-1):
for x in range(1, len(pixelMap[y])-1):
pixel = pixelMap[y][x];
filters = [
[
[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]
]
]
pixelM = [ pixelMap[y+1][x-1:x+2], pixelMap[y][x-1:x+2], pixelMap[y-1][x-1:x+2] ]
r,g,b = 0,0,0
for j in range(0,len(pixelM)):
for i in range(0,len(pixelM[j])):
# pour chacun des filtres
for f in filters:
r += pixelM[j][i].r * f[j][i]
g += pixelM[j][i].g * f[j][i]
b += pixelM[j][i].b * f[j][i]
r = r/(1*len(filters)) % 256
g = g/(1*len(filters)) % 256
b = b/(1*len(filters)) % 256
# définition des couleurs
pixel.setRGB(
# print "%s - %s - %s" % (
int( r ),
int( g ),
int( b )
)
# applique le filtre de "Roberts" sur l'image #
###############################################
# @param pixelMap la matrice de pixels à modifier
#
# @history
# applique le filtre
#
# 1 0
#
# 0 -1
#
def Roberts(self, pixelMap):
# on parcourt tout les pixels
for y in range(1, len(pixelMap)-1):
for x in range(1, len(pixelMap[y])-1):
pixel = pixelMap[y][x]
filters = [
[ [1, 0], [0,-1] ],
[ [0, 1], [-1,0] ]
]
pixelM = [ pixelMap[y][x:x+1], pixelMap[y+1][x:x+1] ]
r,g,b = 0,0,0
for j in range(0,len(pixelM)):
for i in range(0,len(pixelM[j])):
# pour chacun des filtres
for f in filters:
r += pixelM[j][i].r * f[j][i]
g += pixelM[j][i].g * f[j][i]
b += pixelM[j][i].b * f[j][i]
r = r % 256
g = g % 256
b = b % 256
# définition des couleurs
pixel.setRGB(
# print "%s - %s - %s" % (
int( r ),
int( g ),
int( b )
)
# applique le filtre de "Prewitt" sur l'image #
###############################################
# @param pixelMap la matrice de pixels à modifier
#
# @history
# applique le filtre
#
# -1 0 1 -1 -1 -1
#
# 1/3 * -1 0 1 + 0 0 0
#
# -1 0 1 1 1 1
def Prewitt(self, pixelMap):
# on parcourt tout les pixels
for y in range(1, len(pixelMap)-1):
for x in range(1, len(pixelMap[y])-1):
pixel = pixelMap[y][x];
filters = [
3*[[-1, 0, 1]],
[ 3*[-1], 3*[0], 3*[1] ]
]
pixelM = [ pixelMap[y-1][x-1:x+1], pixelMap[y][x-1:x+1], pixelMap[y+1][x-1:x+1] ]
r,g,b = 0,0,0
for j in range(0,len(pixelM)):
for i in range(0,len(pixelM[j])):
# pour chacun des filtres
for f in filters:
r += pixelM[j][i].r * f[j][i]
g += pixelM[j][i].g * f[j][i]
b += pixelM[j][i].b * f[j][i]
r = r/4 % 256
g = g/4 % 256
b = b/4 % 256
# définition des couleurs
pixel.setRGB(
# print "%s - %s - %s" % (
int( r ),
int( g ),
int( b )
)
# applique le filtre de "Sobel" sur l'image #
###############################################
# @param pixelMap la matrice de pixels à modifier
#
# @history
# applique le filtre
#
# -1 0 1 -1 -2 -1
#
# 1/4 * -2 0 2 + 0 0 0
#
# -1 0 1 1 2 1
def Sobel(self, pixelMap):
# on parcourt tout les pixels
for y in range(1, len(pixelMap)-1):
for x in range(1, len(pixelMap[y])-1):
pixel = pixelMap[y][x];
filters = [
[ [-1,0,1], [-2,0,2], [-1,0,1] ],
[ [-1,-2,-1], [0,0,0], [1,2,1] ],
[ [0,1,2], [-1,0,1], [-2,-1,0] ]
]
pixelM = [ pixelMap[y-1][x-1:x+1], pixelMap[y][x-1:x+1], pixelMap[y+1][x-1:x+1] ]
r,g,b = 0,0,0
for j in range(0,len(pixelM)):
for i in range(0,len(pixelM[j])):
# pour chacun des filtres
for f in filters:
r += pixelM[j][i].r * f[j][i]
g += pixelM[j][i].g * f[j][i]
b += pixelM[j][i].b * f[j][i]
r = r/4 % 256
g = g/4 % 256
b = b/4 % 256
# définition des couleurs
pixel.setRGB(
# print "%s - %s - %s" % (
int( r ),
int( g ),
int( b )
)
# applique le filtre de "convolution" sur l'image #
@ -300,10 +45,22 @@ class Filter:
# 1/8 * -1 8 -1
#
# -1 -1 -1
def Convolution(self, pixelMap):
def Convolution(self, pixelMap, kernel=None):
width = len( pixelMap[0] )
height = len( pixelMap )
if kernel == None:
kernel = [
[ 4, 3, 2, 3, 4],
[ 3, 2, 1, 2, 3],
[ 2, 1, 0, 1, 2],
[ 3, 2, 1, 2, 3],
[ 4, 3, 2, 3, 4]
]
kMidWidth = len( kernel[0] ) // 2
kMidHeight = len( kernel ) // 2
# map de résultat (filtrée)
convolvedMap = [ ]
@ -318,13 +75,7 @@ class Filter:
pixel = pixelMap[y][x];
kernel = [
[ 4, 3, 2, 3, 4],
[ 3, 2, 1, 2, 3],
[ 2, 1, 0, 1, 2],
[ 3, 2, 1, 2, 3],
[ 4, 3, 2, 3, 4]
]
# nb total résultant du kernel des valeurs positives
@ -336,17 +87,16 @@ class Filter:
# on définit la matrice de même taille que le kernel mais correspondant aux pixels superposés
pixelM = [];
print "(%s, %s)" % (-len(kernel)/2, 1+len(kernel)/2)
for b in range(1-len(kernel)/2, 1+len(kernel)/2):
for b in range(-kMidHeight, 1+kMidHeight):
pixelM.append( [] );
for a in range(1-len(kernel[b])/2, 1+len(kernel[b])/2):
for a in range(-kMidWidth, 1+kMidWidth):
# on met les valeurs entre 0 et longueur ou largeur pour pas récupérer les valeurs de l'autre côté (lissage bizarre)
ruledX = 0 if x+a<0 else width-1 if x+a>=width else x+a;
ruledY = 0 if y+b<0 else height-1 if y+b>=height else y+b;
print "(%s, %s)" % (b, a)
# pixelM[len(pixelM)-1].append( pixelMap[(y+b)%height][(x+a)%width] );
exit()
# on ajoute le pixel courant
pixelM[len(pixelM)-1].append( pixelMap[ruledY][ruledX] );
r,g,b = 0,0,0

View File

@ -1,514 +0,0 @@
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[usenames,dvipsnames,svgnames,table]{xcolor}
\usepackage{amsmath,amsfonts}
\usepackage{lmodern}
\usepackage{graphicx} % permet l'insertion d'images
\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
% Définition des symboles
\newcommand{\N}{\mathbb{N}} % \N pour les entiers naturels
\newcommand{\R}{\mathbb{R}} % \R pour les réels
\newcommand\V[1]{\overrightarrow{#1}} % $\V{AB}$ pour les vecteurs
\title{TRAITEMENT D'IMAGE\\Débruitage}
\author{Adrien MARQUÈS - Alexis HELSON }
\date{Septembre 2015}
\begin{document}
\maketitle
% ======================== %
% === PART 1 - PRELUDE === %
% ======================== %
\part*{Prélude}
% ====================== %
% === SECT 1 - INTRO === %
% ====================== %
\section{Introduction}
De nombreuses images numériques sont produites aujourd'hui : imagerie médicales, images grand public (appareils photos numériques), numérisation de films ancienc, etc... Une problématique qui se pose est le débruitage des images obtenues. Nous proposons dans ce dossier d'aborder certaines techniques utilisées.\\
\textbf{Image numérique}\par
Une image numérique de taille \begin{math}n_{x} \times n_{y}\end{math} est composée de pixels (le nombre de pixels est \begin{math}n = n_{x}.n_{y}\end{math}), et pour chaque pixel on dispose (selon les cas) :\\
- une valeur entière comprise entre 0 et 255 (image en niveaux de gris codée en 8 bits)\\
- trois valeurs entières comprises entre 0 et 255, correspondant aux trois canaux de couleur (RGB)\\
- une valeur entière codée sur 12 ou 16 bits, ou même sur 1 seul, mais ces cas ne seront pas traités ici.\\
\textbf{Bruit}\par
Dans une image numérique, les processus de dégradation peuvent provenir de plusieurs sources, et donner du bruit qui peut avoir différentes expressions mathématiques. Notons \emph{u} l'image d'origine (l'image <<réelle>>) et \begin{math}u^{OBS}\end{math} l'image mesurée. Les exemples traités dans ce dossiers sont décrits ci-dessous.\par
\indent{
- l'image \begin{math}u^{OBS}\end{math} est mesurée par des appareils électroniques qui sont perturbés par des fluctuations aléatoires, et ces perturbations viennent s'ajouter au signal mesuré. On parle de \emph{bruit addifit}, et on a \begin{math}u^{OBS} = u + n,\end{math} où \emph{n} est le bruit ajouté.
}\\
\indent{
- l'image \begin{math}u^{OBS}\end{math} comporte certains pixels où la valeur est aberrante (par exemple à cause d'un capteur défectueux, ou de défaut de transmission de l'information). Pour fixer les idées, on parle de \emph{bruit <<Salt and Pepper>>} lorsque certains pixels (au hasard) ont un niveau 0, et certains ont un niveau 255.
}\\
\indent{
- lorsque le processus de formation de l'image comporte des compteurs de photons ou des photomultiplicateurs, lerreur commise peut être proportionnelle au signal mesurée. On parle alors de \emph{bruit multiplicatif} et on a \begin{math}u^{OBS} = u.(1+n)\end{math}.
}\\
\hrulefill\\
Cette étude vise à améliorer les méthodes de \emph{nettoyage d'image}, et donc de développer un programme universel de débruitage, c'est-à-dire qu'il réduirait convenablement tout type de bruit, dépendant toutefois de paramètres adaptés à chacun.
\begin{center} \emph{Avant d'essayer d'améliorer quelque chose, il faut d'abord le comprendre.} \end{center}
Nous avons donc commencé par lire des études sur débruitage, la détection de contours, de formes, et la vectorisation d'images.
\noindent Pour cela, nous avont étudié:
\begin{description}
\item[ - Le débruitage standard,]c'est à dire les méthodes déjà existantes.
\item[ - Le filtrage par convolution,]afin de mettre en valeur les contours et formes et d'effectuer des "lissages".
\item[ - La détection de formes,]afin d'effectuer un débruitage sans <<effet escalier>>.
\item[ - La détection de contours,]afin d'optimiser la détection de formes.
\end{description}
Le programme a été développé en Python2 pour la simplicité et efficacité du langage. Le code est disponible sur Github à l'adresse suivante:
\begin{center} \textcolor{blue}{https://github.com/xdrm-brackets/bmp\_python} \end{center}
% =========================== %
% === SECT 2 - ARCHI PROG === %
% =========================== %
\section{Architecture et structure du programme}
\begin{figure}[!ht]
\centering
\includegraphics{fileTree.jpg}
\end{figure}
\begin{description}
\item \textbf{main.py} \hfill \\
Programme principal, il affiche une interface (en console) permettant d'éxécuter une des opérations disponibles.
\item \textbf{tests.py} \hfill \\
Contient les corps de toutes le opérations pouvant être choisies dans le programme principal.
\item \textbf{BMPFile.py} \hfill \\
Contient les structures \emph{BMPFile}, \emph{BMPContent}, \emph{BMPHeader}, permettant d'encoder et de décoder un fichier BMP. Ainsi que la strucure \emph{RGBPixel} permettant de coder un pixel.
\item \textbf{Noise.py} \hfill \\
Contient tout les traitements tels que les bruitages et débruitages, les filtres, et les détections de formes et contours. (il importe tout le dossier \emph{utility})
\item \textbf{utility/}
\begin{description}
\item \textbf{SaltAndPepper\_Noise.py} \hfill \\
Contient les méthodes de bruitage et débruitage du bruit de type \emph{Poivre \& Sel}.
\item \textbf{Additive\_Noise.py} \hfill \\
Contient les méthodes de bruitage et débruitage du bruit de type \emph{additif}.
\item \textbf{Gaussian\_Noise.py} \hfill \\
Contient les méthodes de bruitage et débruitage du bruit de type \emph{gaussien}.
\item \textbf{Multiplicative\_Noise.py} \hfill \\
Contient les méthodes de bruitage et débruitage du bruit de type \emph{multiplicatif}.
\item \textbf{Color\_Noise.py} \hfill \\
Contient les méthodes de bruitage et débruitage du bruit de type \emph{multicolore}.
\item \textbf{Filter.py} \hfill \\
Contient les méthodes de filtrage (standard et par convolution).
\item \textbf{Shape.py} \hfill \\
Contient les méthodes de détection de formes et de contours
\end{description}
\end{description}
Le fichier \textbf{tests.py} utilise la structure \emph{BMPFile} afin de lire/écrire les fichiers ainsi que la structure \emph{Noise} qui contient toutes les méthodes de bruitage et de débruitage, les filtres et les détections de formes et de contours. Le fichier \emph{\textbf{Noise.py}} (qui contient la structure de même nom) appelle les différents fichiers contenus dans le dossier \textbf{utility}. Les fichiers contenus dans \textbf{utility} peuvent être:\\
- Un fichier qui contient toutes les méthodes pour un type de bruit (bruitage et débruitage)\\
- Le fichier \emph{Filters.py} qui contient toutes les méthodes de filtrage\\
- Le fichier \emph{Shapes.py} qui contient toutes les méthodes de détection de formes et contours
% ========================= %
% === SECT 2 - VARIABLE === %
% ========================= %
\section{Variables globales}
Ces valeurs seront utilisées pour la majeure partie des calculs et correspondent à des notations générales à l'image ou aux autres notations utilisées.\\\\
\noindent
Soit \begin{math}(n_x, n_y)\in\N^2\end{math}, respectivement la largeur et la hauteur de l'image en pixels.\\
Soit la matrice \begin{math}I_{n_y, n_x}\end{math} correspondant à la répartition des pixels dans l'image.\\
Soit le couple \begin{math}(x,y)\in\N^2\end{math}, les coordonnés d'un pixel dans I, tel que \begin{math}x\in[0;n_x[,\ et\ y\in[0;n_y[\end{math}.\\
Soit \begin{math}\vec{u}\end{math} le vecteur associé à une unité de contour, tel que \begin{math}||\vec{u}|| = 1,\ et\ sa\ direction\ d =\frac{n\pi}{2}[2\pi]\ rad,\ avec\ n\in\N\end{math}.\\
Soit \begin{math}K_n\end{math}, la matrice carré d'ordre \emph{n}. Par exemple \begin{math}K_3 = \begin{pmatrix}k_1&k_2&k_3\\k_4&k_5&k_6\\k_7&k_8&k_9\\\end{pmatrix}\end{math}\\\\
\newpage
% ========================= %
% === PART 2 - ENCODAGE === %
% ========================= %
\part*{Encodage et décodage de fichiers}
% =============================== %
% === SECT 1 - FONCTIONNEMENT === %
% =============================== %
\section{Fonctionnement global}
La lecture et l'écriture des fichiers se fait octet par octet, la structure \emph{BMPFile} permet de transformer les octets d'un fichier BMP en matrice de pixels, et inversement, de transformer une matrice de pixels en fichier BMP. Les types d'encodage des couleurs pris en charge sont 8 (nuance de gris), et 24 (rouge, vert, bleu) bits par pixels. Les pixels sont du type \emph{RGBPixel}, ce type contient les coordonnées du pixel (x, y), ainsi que sa couleur au format RGB (rouge, vert, bleu) chaque nuance prend sa valeur entre 0 et 255.
\\\par Le seul format pris en charge est le format BMP. Pour que le programme fonctionne avec d'autres formats (jpeg, png, gif, etc), il suffirait de récupérer une matrice de \emph{RGBPixel} à partir d'une image. Toutes les méthodes de traitement d'image du programme agissent uniquement sur cette matrice. Il serait ainsi possible de convertir une image vers un autre format. Le fichier BMP peut se décomposer en 3 parties:
\begin{description}
\item - Le \emph{header} donne des informations sur le fichier et son contenu. \hfill\\
Sa taille est de 54 octets.
\item - La \emph{palette} donne des informations sur l'encodage des couleurs. \hfill\\
Sa taille est variable, elle est donnée dans le header.
\item - Le \emph{bitmap} est la matrice de pixels, c'est le <<corps>> du fichier. \hfill\\
Sa taille est variable, elle est donnée dans le header.
\end{description}
% ====================== %
% === SUBS 1 - HEADE === %
% ====================== %
\subsection{Le header}
Le header fournit des informations sur le fichier, sur l'image, sur la palette et sur les tailles et positions des différentes parties. Il est
\begin{center}\begin{tabular}{|c|c|l|}
\hline \textbf{Position (octets)} & \textbf{Taille} & \textbf{Libellé}\\
\hline 0 & 2 octets & signature, toujours 4D42\\
\hline 2 & 4 octets & taille du fichier (octets)\\
\hline 6 & 2 octets & réservé (défaut: 0)\\
\hline 8 & 2 octets & réservé (défaut: 0)\\
\hline 10 & 4 octets & offset de la bitmap (octets)\\
\hline 10 & 4 octets & taille du BITMAPINFOHEADER (octets)\\
\hline 14 & 4 octets & largeur de l'image (pixels)\\
\hline 18 & 4 octets & hauteur de l'image (pixels)\\
\hline 22 & 2 octets & nombre de plans (défaut: 0001)\\
\hline 26 & 2 octets & nombre de bits par pixels (1, 4, 8, ou 24)\\
\hline 30 & 4 octets & type de compression (0=rien, 1=RLE-8, 2=RLE-4)\\
\hline 34 & 4 octets & taille de l'image padding inclus (octets)\\
\hline 38 & 4 octets & résolution horizontale (pixels)\\
\hline 42 & 4 octets & résolution verticale (pixels)\\
\hline 46 & 4 octets & nombre de couleurs ou 0\\
\hline 50 & 4 octets & nombre de couleurs importantes ou 0\\
\hline
\end{tabular}\newline\newline Figure 1 - BMP Header\end{center}
% ====================== %
% === SUBS 2 - PALET === %
% ====================== %
\subsection{La palette}
La palette permet de définir les différentes couleurs d'une image. Elle correspond à une liste de couleurs ou bien à un <<code>> associé à un encodage spécifique. Elle dépend en premier lieu du nombre de bits par pixels. Cette valeur nous informe sur combien de bits est codée chaque couleur, les valeurs possibles sont 1, 4, 8, et 24. Le nombre de couleurs possibles dépend directement du \emph{bpp} (bits par pixels), plus il est grand, plus il y a de nuances. \begin{math}nbcouleurs = 2^{bpp}\end{math}. Les différents types de palette correspondant à un \emph{bpp} sont décrites ci-dessous.
% ======================== %
% === S2SECT 1 - 8 BPP === %
% ======================== %
\subsubsection{Encodage en 8 bits par pixels}
Pour une image encodée en 8 bits par pixels, chaque pixel est codé sur 1 octet. Il y a donc une possibilité de \begin{math}2^8 = 256\end{math} couleurs. Ces 256 couleurs sont définies dans la \emph{palette} sur 4 octets chacunes. Les 3 premiers octets contiennent les couleurs au format RGB, et le dernier octet est à "0", c'est un octet de bourrage car la taille du fichier doit être multiple de 4. Par exemple si l'on veut que la couleur "0" corresponde à du rouge (R=255,G=0,B=0), et la couleur 1 à du rose (R=255,G=0,B=255), la palette commencera par: \\\\
\begin{tabular}{|c|c|c|c|c|c|}
\hline
\textbf{rang}&\textbf{couleur}&\textbf{octet1}&\textbf{octet2}&\textbf{octet3}&\textbf{octet4}\\\hline
0 & rouge & 255 & 0 & 0 & 0\\\hline
1 & rose & 255 & 0 & 255 & 0\\\hline
.. & .. & .. & .. & .. & ..\\\hline
255 & .. & .. & .. & .. & 0\\\hline
\end{tabular}\\\\
Par défaut, nous utilisons uniquement le codage en 8 bits par pixels pour des nuances de gris, notre palette a donc comme valeurs:\\\\
\begin{tabular}{|c|c|c|c|c|c|}
\hline
\textbf{rang}&\textbf{couleur}&\textbf{octetS}&\textbf{octet2}&\textbf{octet3}&\textbf{octet4}\\\hline
0 & noir & 0 & 0 & 0 & 0\\\hline
1 & noir & 1 & 1 & 1 & 0\\\hline
2 & noir & 2 & 2 & 2 & 0\\\hline
.. & .. & .. & .. & .. & ..\\\hline
254 & blanc & 254 & 254 & 254 & 0\\\hline
255 & blanc & 255 & 255 & 255 & 0\\\hline
\end{tabular} * \begin{math}4\times256 = 1024\ octets\end{math} au total
% ========================= %
% === S2SECT 2 - 24 BPP === %
% ========================= %
\subsubsection{Encodage en 24 bits par pixels}
Pour une image encodée en 24 bits par pixels, chaque pixel est codé sur 3 octets au format BGR, ce format est équivalent au format RGB, mis à part l'ordre des octets qui est inversé, celà correspond à \begin{math}2^24 = 16.777.216\end{math} couleurs par pixels. La \emph{palette} associée est définie par défaut comme suit:\\\\
\begin{tabular}{|c|c|c|c|}
\hline
\textbf{Position (octets)}&\textbf{Taille (octets)}&\textbf{Valeur entière}&\textbf{Valeur ASCII}\\\hline
0 & 1 & 66 & "B" \\\hline
1 & 1 & 71 & "G" \\\hline
2 & 1 & 82 & "R" \\\hline
3 & 1 & 115 & "s" \\\hline
4 & 48 & 0 & inconnu\\\hline
52 & 1 & 2 & inconnu\\\hline
53 & 15 & 0 & inconnu \\\hline
\end{tabular} * 68 octets au total
% ====================== %
% === SUBS 3 - BITMA === %
% ====================== %
\subsection{Le bitmap}
Le \emph{bitmap} du fichier (matrice de pixels) peut avoir plusieurs formats qui sont propres au nombre de bits par pixels et dépendent de la \emph{palette}. De plus la matrice est dans l'ordre inverse, c'est à dire que le premier pixel est en fait le dernier, il convient donc d'inverser les lignes et les colonnes. De manière générale les pixels sont enregistrés en une succession de lignes. Le nombre d'octets de chaque ligne doit être un multiple de 4, est donc ajouté en fin de ligne un <<padding>> composé de 0 à 3 octets ayant pour valeur zéro.
\newpage
% ====================== %
% === PART 3 - BRUIT === %
% ====================== %
\part*{Bruits}
% =================== %
% === SECT1 - P&S === %
% =================== %
\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{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]
\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. 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 - BER === %
% =================== %
\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 <<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. 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]
\centering
\begin{minipage}[t]{5cm}
\centering
\includegraphics[width=5cm,height=5cm]{lena.jpg}
Image originale
\end{minipage}
\begin{minipage}[t]{5cm}
\centering
\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/algo1_30.jpg}
Débruitée, seuil de .35
\end{minipage}
\end{figure}
% effet 50% (zoom)
\begin{figure}[!ht]
\centering
\begin{minipage}[t]{5cm}
\centering
\includegraphics[width=5cm,height=5cm]{lenaZOOM.jpg}
Image originale (zoom)
\end{minipage}
\begin{minipage}[t]{5cm}
\centering
\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/algo1_30_ZOOM.jpg}
Débruitée, seuil de .35 (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 <<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}).\\\\
\newpage
\textbf{Débruitage \begin{math}\textbf{n}^\textbf{o}\end{math}2: }L'image est débruitée en fonction du paramètre \begin{math}seuil \in \N^+ \text{, tel que } seuil \in [0; \frac{n^2-1}{2} ] \end{math}. Pour chaque pixel, on établit la matrice carré \begin{math}M_n\end{math} d'ordre \emph{n} correspondant à son voisinage. Soit \begin{math}P_{2,2}\end{math} le pixel en cours, et
\begin{align*}M_{3} = \begin{pmatrix}
P_{1,1} & P_{1,2} & P_{1,3}\\
P_{2,1} & P_{2,2} & P_{2,3}\\
P_{3,1} & P_{3,2} & P_{3,3}\\
\end{pmatrix}\end{align*}
\noindent On calcule ensuite \begin{math}M'_n\end{math} la matrice carré d'ordre \emph{n} correspondant à la différence absolue à \begin{math}P_{2,2}\end{math}.
\begin{align*}
M'_3 =
\begin{pmatrix}
|P_{1,1}-P_{2,2}| & |P_{1,2}-P_{2,2}| & |P_{1,3}-P_{2,2}|\\
|P_{2,1}-P_{2,2}| & |P_{2,2}-P_{2,2}| & |P_{2,3}-P_{2,2}|\\
|P_{3,1}-P_{2,2}| & |P_{3,2}-P_{2,2}| & |P_{3,3}-P_{2,2}|\\
\end{pmatrix}
=
\begin{pmatrix}
|P_{1,1}-P_{2,2}| & |P_{1,2}-P_{2,2}| & |P_{1,3}-P_{2,2}|\\
|P_{2,1}-P_{2,2}| & 0 & |P_{2,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{align*}
\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*}
Si le poids statistique d'un pixel est supérieur à \emph{seuil}, alors un filtre moyen lui est appliqué.
% effet 50%
\begin{figure}[!ht]
\centering
\begin{minipage}[t]{5cm}
\centering
\includegraphics[width=5cm,height=5cm]{lena.jpg}
Image originale
\end{minipage}
\begin{minipage}[t]{5cm}
\centering
\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/algo2_30.jpg}
Débruitée, seuil de .05
\end{minipage}
\end{figure}
% effet 50% (zoom)
\begin{figure}[!ht]
\centering
\begin{minipage}[t]{5cm}
\centering
\includegraphics[width=5cm,height=5cm]{lenaZOOM.jpg}
Image originale (zoom)
\end{minipage}
\begin{minipage}[t]{5cm}
\centering
\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/algo2_30_ZOOM.jpg}
Débruitée, seuil de .05 (zoom)
\end{minipage}
\end{figure}
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}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@ -0,0 +1,533 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="29.647444mm"
height="7.0852261mm"
viewBox="0 0 105.05 25.105132"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="irregular1.svg"
inkscape:export-filename="/home/xdrm/Bureau/GITHUB/bmp_python/dossier/Vectorization/irregular1.png"
inkscape:export-xdpi="1285.1024"
inkscape:export-ydpi="1285.1024">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="8"
inkscape:cx="11.894226"
inkscape:cy="-29.907793"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:snap-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1056"
inkscape:window-x="0"
inkscape:window-y="24"
inkscape:window-maximized="1"
inkscape:bbox-nodes="true"
inkscape:snap-grids="true" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(305.62635,-347.1392)">
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4349"
width="5"
height="5"
x="-300.59845"
y="362.19177" />
<rect
y="362.19177"
x="-295.59149"
height="5"
width="5"
id="rect4370"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
y="362.19177"
x="-290.59845"
height="5"
width="5"
id="rect4391"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4393"
width="5"
height="5"
x="-285.59149"
y="362.19177" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4395"
width="5"
height="5"
x="-280.59845"
y="362.19177" />
<rect
y="362.19177"
x="-275.59149"
height="5"
width="5"
id="rect4397"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
y="362.19177"
x="-270.59845"
height="5"
width="5"
id="rect4399"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4401"
width="5"
height="5"
x="-265.59149"
y="362.19177" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4403"
width="5"
height="5"
x="-260.59845"
y="362.19177" />
<rect
y="362.19177"
x="-255.59149"
height="5"
width="5"
id="rect4405"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
y="362.19177"
x="-260.59845"
height="5"
width="5"
id="rect4407"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4409"
width="5"
height="5"
x="-255.59149"
y="362.19177" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4411"
width="5"
height="5"
x="-250.59845"
y="362.19177" />
<rect
y="362.19177"
x="-245.59149"
height="5"
width="5"
id="rect4413"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
y="362.19177"
x="-240.59845"
height="5"
width="5"
id="rect4415"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4417"
width="5"
height="5"
x="-235.59149"
y="362.19177" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4419"
width="5"
height="5"
x="-230.59845"
y="362.19177" />
<rect
y="362.19177"
x="-225.59149"
height="5"
width="5"
id="rect4421"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
y="362.19177"
x="-220.59845"
height="5"
width="5"
id="rect4427"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
y="357.19177"
x="-300.59845"
height="5"
width="5"
id="rect4429"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4431"
width="5"
height="5"
x="-295.59149"
y="357.19177" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4433"
width="5"
height="5"
x="-290.59845"
y="357.19177" />
<rect
y="357.19177"
x="-285.59149"
height="5"
width="5"
id="rect4435"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
y="357.19177"
x="-280.59845"
height="5"
width="5"
id="rect4437"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4439"
width="5"
height="5"
x="-275.59149"
y="357.19177" />
<rect
y="357.19177"
x="-260.59845"
height="5"
width="5"
id="rect4445"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4447"
width="5"
height="5"
x="-255.59149"
y="357.19177" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4449"
width="5"
height="5"
x="-260.59845"
y="357.19177" />
<rect
y="357.19177"
x="-255.59149"
height="5"
width="5"
id="rect4451"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4455"
width="5"
height="5"
x="-245.59149"
y="357.19177" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4457"
width="5"
height="5"
x="-240.59845"
y="357.19177" />
<rect
y="357.19177"
x="-235.59149"
height="5"
width="5"
id="rect4459"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
y="357.19177"
x="-230.59845"
height="5"
width="5"
id="rect4461"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4463"
width="5"
height="5"
x="-225.59149"
y="357.19177" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4469"
width="5"
height="5"
x="-295.59149"
y="352.19177" />
<rect
y="352.19177"
x="-285.59149"
height="5"
width="5"
id="rect4473"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
y="352.19177"
x="-280.59845"
height="5"
width="5"
id="rect4475"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4485"
width="5"
height="5"
x="-255.59149"
y="352.19177" />
<rect
y="352.19177"
x="-255.59149"
height="5"
width="5"
id="rect4489"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4493"
width="5"
height="5"
x="-245.59149"
y="352.19177" />
<rect
y="352.19177"
x="-230.59845"
height="5"
width="5"
id="rect4499"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4509"
width="5"
height="5"
x="-215.59149"
y="362.19177" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4511"
width="5"
height="5"
x="-210.59845"
y="362.19177" />
<rect
y="357.19177"
x="-215.59149"
height="5"
width="5"
id="rect4517"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
y="357.19177"
x="-210.59845"
height="5"
width="5"
id="rect4519"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
y="352.19177"
x="-215.59149"
height="5"
width="5"
id="rect4542"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#0000ff;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<g
id="g4300"
style="stroke-width:0.20000001;stroke-miterlimit:4;stroke-dasharray:none">
<path
inkscape:connector-curvature="0"
id="path4232"
d="m -305.57635,347.19177 0,25"
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -300.62765,347.19177 0,25"
id="path4240"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -295.57635,347.19177 0,25"
id="path4248"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path4250"
d="m -290.62765,347.19177 0,25"
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4252"
d="m -285.57635,347.19177 0,25"
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -280.62765,347.19177 0,25"
id="path4254"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -275.57635,347.19177 0,25"
id="path4256"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path4258"
d="m -270.62765,347.19177 0,25"
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4260"
d="m -265.57635,347.19177 0,25"
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -260.62765,347.19177 0,25"
id="path4262"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -255.57635,347.19177 0,25"
id="path4264"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path4266"
d="m -250.62765,347.19177 0,25"
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4268"
d="m -245.57635,347.19177 0,25"
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -240.62765,347.19177 0,25"
id="path4270"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -235.57635,347.19177 0,25"
id="path4272"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path4274"
d="m -230.62765,347.19177 0,25"
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4276"
d="m -225.57635,347.19177 0,25"
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -220.62765,347.19177 0,25"
id="path4278"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -215.57635,347.19177 0,25"
id="path4280"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path4282"
d="m -210.62765,347.19177 0,25"
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4284"
d="m -305.57635,347.19177 105,0"
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4286"
d="m -305.57635,372.19177 105,0"
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -305.57635,352.19177 105,0"
id="path4288"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -305.57635,357.19177 105,0"
id="path4292"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path4294"
d="m -305.57635,362.19177 105,0"
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4296"
d="m -305.57635,367.19177 105,0"
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4505"
d="m -205.57635,347.19177 0,25"
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.20000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -200.62765,347.19177 0,25"
id="path4507"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -3,7 +3,7 @@
\usepackage[usenames,dvipsnames,svgnames,table]{xcolor}
\usepackage{amsmath,amsfonts}
\usepackage{lmodern}
\usepackage{graphicx} % permet l'insertion d'images
\usepackage{graphicx} % permet l'insertion d'images
\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
% Définition des symboles
@ -443,7 +443,7 @@
% =================== %
% === SECT1 - ADD === %
% === SECT3 - 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é.\\\\
@ -507,6 +507,38 @@
\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
% ====================== %
% === PART 4 - VECTO === %
% ====================== %
\part*{Vectorisation pour la détection de contours}
% =================== %
% === SECT1 - BAS === %
% =================== %
\section{Problème de base}
\textbf{Problème: }Nous avons remarqué précedemment que de manière générale après un débruitage, les contours de l'image deviennent irréguliers.\\
\textbf{Solution: }La solution retenue s'appuie sur la \textbf{vectorisation}, cette partie vise à <<régulariser>> les contours. Nous ne parlons pas ici de les lisser mais de les redessiner.\\
% =================== %
% === SECT2 - DET === %
% =================== %
\section{Processus détaillé}
\textbf{Etape 1: }\par
En premier lieu, il faut isoler les contours uniquement, il existe plusieurs moyens de le faire:\\
- soustraire l'image de base à l'image lissée (filtre moyen)\\
- utiliser un algorithme non-récursif d'indépendentisation de contour.\\
Nous avons mis au point les 2 méthodes vues ci-dessus afin de comparer leur temps d'exécution et leur efficacité. Ceci nous permettra de plus de les combiner.\\
\indent \emph{Méthode 1 - soustraction de l'image lissée}\\
L'image est lissée avec un \begin{math}seuil \in \R \in [0;1]\end{math}, qui plus il est bas
\newpage