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:
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);
}
L’égalisation fournit dans OpenCV equalizeHist à tendance à brûler l'image.
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:
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);
}
Si quelqu'un c'est déjà posé la question de sont fonctionnement, je suis preneur
Merci