Notes d'étude OpenCV pour modifier le contraste et la luminosité de l'image

1. Contraste et luminosité de l'image

Le contraste de l'image fait référence à la mesure des différents niveaux de luminosité entre le blanc le plus clair et le noir le plus foncé dans les zones claires et sombres d'une image, c'est-à-dire la taille du contraste en niveaux de gris d'une image. Plus la plage de différence est grande, plus le contraste est élevé et plus la plage de différence est petite, plus le contraste est petit. Un bon rapport de contraste de 120: 1 peut facilement afficher des couleurs vives et riches. Lorsque le rapport de contraste est aussi élevé que 300: 1, tous les niveaux peuvent être pris en charge. couleur de s.

Loi de Weber (la loi du seuil sensoriel ): [2]   Sous le même stimulus, la plage dynamique du stimulus qu'une personne peut ressentir est proportionnelle à l'intensité du stimulus standard, K = ΔI / I  K est une constante sous un stimulus donné, I est Stimulus , ΔI est la plage dynamique du stimulus qui peut être ressentie.

Appliqué aux stimuli visuels humains, définissez le contraste de Weber comme:

I est la luminosité de l'objet, et I b est la luminosité globale de l'arrière-plan.

Contraste de Michelson

Michelson [3] Le   contraste est également appelé «visibilité» et est défini comme:

Où la  somme

Représente respectivement la luminosité la plus lumineuse et la luminosité la plus sombre. Le contraste de Michelson est théoriquement cohérent avec la perception des cellules coniques à la fréquence spatiale du champ de flux lumineux dans l' expérience visuelle humaine .

Contraste RMS

Peli a proposé en 1990 que le contraste d'une image qui n'a rien à voir avec la fréquence spatiale et la distribution spatiale du contenu soit défini comme la [4] racine carrée moyenne (c'est-à-dire l'écart type) de la valeur du pixel dans une image raster :  

parmi eux

Décrit une image raster avec une largeur et une hauteur respectivement w et h,

Est la valeur d'un pixel à une position spécifiée dans l'image,

 Est la luminosité de l'image (pixel moyen),

 Est le contraste quadratique moyen (écart type des pixels).

Pour la transformation d'image numérique, supposons que l'échelle de gris du pixel d'origine est  f (i, j) et que l'échelle de gris du pixel converti est  g (i, j) , alors la transformation linéaire couramment utilisée est  g (i, j) = af (i, j) ) + b , où le coefficient a affecte le contraste de l'image et le coefficient b affecte la luminosité de l'image, comme suit:
(1) Quand a = 1, c'est l'image d'origine;
(2) Quand a> 1, le contraste est amélioré et l'image semble plus claire;
( 3) Lorsque a <1, le contraste diminue et l'image semble plus sombre;
(4) b affecte la luminosité de l'image. Lorsque b (b> 0) augmente et b (b> 0) diminue, la valeur globale des niveaux de gris de l'image augmente Déplacer ou se déplacer vers le bas, c'est-à-dire que l'image globale devient plus claire ou plus sombre et ne change pas le contraste de l'image

2. Pratique

#include <QCoreApplication>
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include <QDebug>
#include <QDir>
#include <QFile>
#include "iostream"

using namespace std;
using namespace cv;

int main()
{
    double alpha = 2.2 , beta = 50;
    Mat oriImg;
    //! 读取图片
    oriImg = imread("C:/1.png",IMREAD_COLOR);
    if( !oriImg.data ) { qDebug("Error loading src1 \n"); return -1; }
    imshow("ori",oriImg);

    //! 图片大小要一致
    Mat resImg = Mat::zeros( oriImg.size(), oriImg.type() ); 
    //! 执行运算 resImg(i,j) = alpha*oriImg(i,j) + beta
    for( int y = 0; y < oriImg.rows; y++ )
    {
        for( int x = 0; x < oriImg.cols; x++ )
        {
            for( int c = 0; c < 3; c++ )
            {
                resImg.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( oriImg.at<Vec3b>(y,x)[c] ) + beta );
            }
        }
    }

    imshow( "adjust", resImg );
    waitKey(0);
    return 0;
}

Matériel de référence:

Annexe 1: Le rôle de saturate_cast

Pour une conversion sûre, le résultat de l'opération peut dépasser la plage de valeurs de pixels (dépassement de capacité), ou il peut s'agir d'un nombre non entier (s'il s'agit d'un nombre à virgule flottante). Utilisez saturate_cast pour convertir le résultat afin de vous assurer qu'il s'agit d'une valeur valide.

Je suppose que tu aimes

Origine blog.csdn.net/a8039974/article/details/104862821
conseillé
Classement