Étirement d'un histogramme
salut, j'ai une question svp
Une photo radiographique est généralement une image en niveaux de gris. elle a
souvent un faible contraste et de faibles intensités de niveaux de gris, c’est-à-dire que toutes les valeurs d’intensité
sont dans la plage de [a, b], où a et b sont des nombres entiers positifs, bien inférieurs à la valeur d’intensité maximale
255 s’il s’agit d’une image 8 bits. Afin d’améliorer l’apparence de cette image, une simple opération "d’étirement"
peut être utilisée pour convertir toutes les valeurs d’intensité d’origine
f0 en f : f = (255/b-a)*(fo-a) = T(i) = [Max/(Imax-Imin)]*(i-Imin)
• Si la valeur DC pour l’image originale f0 est m, quelle est la valeur DC pour l’image étirée f ?
• Si l’une des valeurs AC F0(2, 1) pour l’image originale f0 est n, quelle est la valeur F(2, 1) pour l’image étirée f ?
Étirement d'un histogramme
Bonjour,
La finalité du procédé visant à étendre la répartition des teintes sur la totalité de la plage disponible [0 ; 255] est bien exprimée; par contre je n'ai pas bien compris la fin du calcul.
Le niveau de gris étant initialement confiné au domaine [a ; b]: a ≤ g ≤ b
il est possible d'en déduire une nouvelle valeur (g') par une simple relation de proportionnalité:
(g' - 0)/(255 - 0) = (g - a)/(b - a) , d'où: g' = 255(g - a)/(b - a) .
On vérifie aisément pour la fonction obtenue g' = F(g) les cas limites: F(a) = 0 ; F(b) = 255 .
Il n'est pas certain que le procédé permette un meilleure observation des détails; l'intervention d'une fonction non-linéaire, une conversion appropriée du gris en couleurs permettraient peut-être d'améliorer le contraste. Disposes-tu d'images à examiner ?
1 pièce(s) jointe(s)
Étirement d'un histogramme
Bonjour,
Les solutions proposées sont intéressantes. Il semble d'après cela que l'obtention d'un meilleur contraste passe par un traitement local de l'image.
Voici néanmoins ce que l'on obtient à l'aide d'une fonction non linéaire, résultant du raccordement de deux monômes de degré 4, et continue ainsi que sa dérivée première au point de raccordement:
Les 3 images ne diffèrent que pas l'abscisse du point de raccordement: L3 = (3 * 120) , (3 * 100) , (3 * 80) .
Le niveau de gris correspond ici à la somme des 3 indices de couleur: s = r + v + b = 3g:
deux cas se présentent dans le calcul:
Code:
1 2 3
| SI (s<L3) ALORS t = s^4/L3^3 // M3 = 3*255
SINON t = M3 - (M3 - s)^4/(M3 - L3)^3
niveau de gris final: g' = Round(t/3) . |
Comme on pouvait s'y attendre, les détails tendent à s'estomper dans la zone la plus lumineuse.
Pourquoi remettre à demain ce qu'on peut remettre à la semaine prochaine ?
Bonjour wiwaxia,
Citation:
Envoyé par
wiwaxia
...Voici néanmoins ce que l'on obtient à l'aide d'une fonction non linéaire, résultant du raccordement de deux monômes de degré 4, et continue ainsi que sa dérivée première au point de raccordement:
Le niveau de gris correspond ici à la somme des 3 indices de couleur: s = r + v + b = 3g:
deux cas se présentent dans le calcul:
Code:
1 2 3
| SI (s<L3) ALORS t = s^4/L3^3
SINON t = M3 - (M3 - s)^4/(M3 - L3)^3
niveau de gris final: g' = Round(t/3) . |
La deuxième transformation me semble la plus intéressante
Je présume que tu travailles avec une LUT de 256*3 valeurs pour limiter la charge de calcul. Peut être même avec une diffusion d'erreur (l'arrondi) type Floyd-Steinberg (ce qui nécessite un second tableau).
Comme je travaillais en couleur et que je ne voulais pas de virage coloré, les histogrammes se composent des composantes min et max de chaque couleur (deux valeurs par pixel). L'avantage d'un histogramme est de ne pas être obligé de prendre les extrêmes qui réduisent la sensibilité à un seul point noir ou blanc. Cela permet de prendre une valeur mini ou maxi qui regroupe au moins x% des pixels. Bien sûr, cela peut provoquer des virages par écrêtage mais si x est faible, ils seront très peu visibles dans les blancs et les noirs
Ton approche m'a incité à regarder mon code (assez ancien) pour savoir si je travaillais seulement en linéaire (ce qui est le cas) ou si je rééquilibrais la valeur médiane (ordre 2 à l'horizon). Ca pourrait être intéressant mais je n'arrive déjà pas à me décider à porter ce vieux code de 32 bits en 64 bits et de MMX à SSE... :oops:
C'est peut être le moment.
Salut
3 pièce(s) jointe(s)
Étirement d'un histogramme
Bonjour Guesset,
Voici le graphe de la fonction de correspondance g' = F(g) employée lors de la transformation de l'image, et correspondant au dernier essai (Limite = 80):
Sa forme est assez sommaire; on aurait pu envisager
# un exposant plus élevé (n = 6 ou 8) conduisant à une plus forte pente,
# un binôme se caractérisant par un point d'inflexion (F"(L1) = 0) au voisinage du raccordement des deux morceaux, par exemple:
P(u) = (14 - 3u4).u4/11 ,
mais cela relève d'une recherche purement formelle.
Pour en revenir à l'image de plus fort contraste (L3 = 3.L1 = 240)
la rotule apparaît insuffisamment éclairée, et plus encore les zones sombres environnantes sur la gauche, tandis qu'un excès de lumière sature les images des extrémités des os longs, et tend à en estomper les détails.
Il faudrait donc atténuer les plus forts éclairements, renforcer les éclairements moyens tout en maintenant les zones les plus sombres, dépourvues de toute information picturale.
On peut envisager des fonctions à deux paramètres, dont les précédentes constituaient un cas particulier, et dont une famille est représentée par le faisceau de graphes ci-dessous (L1 = 80):
Étirement d'un histogramme
Citation:
Envoyé par
Guesset
... Je présume que tu travailles avec une LUT de 256*3 valeurs pour limiter la charge de calcul ...
Non, parce que je me suis focalisé sur la recherche de la fonction la plus appropriée, et que la seconde image apparaît assez rapidement.
Tu as cependant entièrement raison: les petites images proposées présentent déjà plus de 50000 pixels. Cela conduit à envisager le recours aux pointeurs, que je n'utilise pas volontiers.
Citation:
Envoyé par
Guesset
... Peut être même avec une diffusion d'erreur (l'arrondi) type Floyd-Steinberg (ce qui nécessite un second tableau) ...
Là, tu exagères ! L'erreur d'arrondi résultant de la division euclidienne par 3 (soit ±1/3) est très faible et reste en-dessous du seuil de sensibilité de l'œil; de plus ... le calcul s'arrête là. Rien de commun avec le cumul d'erreurs résultant de la réduction du nombre de couleurs - à moins que le sens de ta remarque ne m'échappe totalement.
Et s'il faut absolument supprimer toute dérive du calcul, rien n'interdit d'ajouter ou de retrancher (1) à l'une des composantes du nouveau pixel - si possible la plus forte ou la plus faible.
Citation:
Envoyé par
Guesset
... L'avantage d'un histogramme est de ne pas être obligé de prendre les extrêmes qui réduisent la sensibilité à un seul point noir ou blanc. Cela permet de prendre une valeur mini ou maxi qui regroupe au moins x% des pixels. Bien sûr, cela peut provoquer des virages par écrêtage mais si x est faible, ils seront très peu visibles dans les blancs et les noirs ...
J'avais effectivement songé à éliminer des pixels de plus faible clarté (5 à 15 % ?), dépourvus de valeur informative, pour obtenir un intervalle plus étroit
[a' ; b], avec a' > a .
La fonction utilisée, qui tend à réduire les gris les plus sombres à zéro, se charge en quelque sorte du travail.
4 pièce(s) jointe(s)
Étirement d'un histogramme
Bonjour,
J'ai voulu regarder de plus près la distribution des niveaux de gris et, faute de données disponibles sur le logiciel de traitement d'images - IrfanView, dont je suis loin de connaître toutes les ressources - j'ai programmé l'affichage de l'histogramme et le calcul des quartiles par le repérage des sommes cumulées successives encadrant la fraction de la somme totale:
Cela donne une indication précise de la répartition des valeurs:
Gmin = 1 ; Gmax= 250; Q1 = 30 ; Med = 76 .
Il ressort de l'examen des images précédemment obtenues qu'il faut augmenter la luminance des zones de clarté moyenne ou forte, qui seules contiennent des détails anatomiques; l'éclairement des zones les plus sombres peut être brutalement ramené à zéro sans perte d'information picturale, ce qui permet d'augmenter le contraste de l'ensemble.
D'où deux séries d'images correspondant à diverses valeurs du seuil de gris:
Lim = 30 ,50 , 70 , 90
situées comme tu l'avais pressenti pas très loin de la médiane.
Les deux fonctions font intervenir le paramètre p = (s-L3)/(Smax - L3))
calculé à partie de la somme des indices de couleur: s = r + v + b
et de sa limite inférieure L3 = 3 * LIm ;
on obtient à partir de là:
Reste à savoir dans quelle série un radiologue peut observer le plus de détails utiles; une combinaison des deux fonctions précédentes conduisant à des valeurs intermédiaires, par exemple:
qA = p1/2 , qB = (p*(2-p))1/2 , Couleur_C(λ) = Round(255 * (λ * qA + (1 - λ)*qB)) .
peut se révéler intéressante.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
CONST M3 = 255; Smax = 3 * 250;
Lim = 90; L3 = 3 * Lim;
Delta = Smax- L3; I_Delta = 1 / Delta;
... / ...
FUNCTION Couleur_00(Px1: Pixel): Pixel;
VAR g, j: Byte; s:Z_32; p, q: Reel; Px2: Pixel;
BEGIN
s:= Px1[1]; FOR j:= 2 TO 3 DO Inc(s, Px1[j]);
IF (s>L3) THEN BEGIN
p:= I_Delta * (s - L3); q:= Sqrt(p);
g:= Round(255 * q)
END
ELSE g:= 0;
FOR j:= 1 TO 3 DO Px2[j]:= g;
Result:= Px2
END;
FUNCTION Couleur(Px1: Pixel): Pixel;
VAR g, j: Byte; s:Z_32; p, q: Reel; Px2: Pixel;
BEGIN
s:= Px1[1]; FOR j:= 2 TO 3 DO Inc(s, Px1[j]);
IF (s>L3) THEN BEGIN
p:= I_Delta * (s - L3); q:= Sqrt(p * (2 - p));
g:= Round(255 * q)
END
ELSE g:= 0;
FOR j:= 1 TO 3 DO Px2[j]:= g;
Result:= Px2
END; |
Citation:
Envoyé par
Guesset
... / ... Je me demande si nous n'avons pas perdu le PO ? ...
Malheureusement, c'est bien possible :D