Bonjour, je cherche à refaire un des filtres les plus connus de Photoshop, le contraste automatique.
Je connais quelques méthodes d'étirement d'histogramme mais aucune ne donne le même résultat.
J'ai lus sur le site d'adobe, qu'il ne prenait pas en compte les 5% des extrêmes de l'histogramme.
J'utilise OpenCV pour réaliser mes traitements
La méthode qui s'en rapproche le plus est celle-ci:
L’égalisation fournit dans OpenCV equalizeHist à tendance à brûler l'image.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 void contrastAuto(Mat img) { double min; double max; minMaxLoc(img, &min, &max); float diff = max - min; max = max*0.95; min = min*1.05; for(int y=0; y<img.cols; ++y) for(int x=0; x<img.rows; ++x) img.data[y*img.rows + x] = MAX(MIN((((img.data[y*img.rows + x] - min) / diff) * 255), 255), 0); }
La méthode de création de LUT en fonction de l'histogramme donne la même chose que equalizeHist
Et enfin un autre résultat:
Si quelqu'un c'est déjà posé la question de sont fonctionnement, je suis preneur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 void normalize_gray (Mat img) { double min, max, alpha, beta; minMaxLoc(img, &min, &max); max = max*0.95; min = min*1.05; alpha = 255.0 / (max - min); beta = -min * alpha; for (int i = 0; i < img.cols * img.rows; ++i) img.data[i] = MAX(MIN(alpha * img.data[i] + beta, 255), 0); }
Merci
Partager