画像のコントラストと明るさを変更するためのOpenCVスタディノート

1.画像のコントラストと明るさ

画像のコントラストとは、画像の明るい領域と暗い領域の最も明るい白と最も暗い黒の間のさまざまな輝度レベル、つまり画像のグレースケールコントラストのサイズの測定値を指します。差の範囲が大きいほどコントラストが大きくなり、差の範囲が小さいほどコントラストが小さくなります。コントラスト比が120:1の場合、鮮やかで豊かな色を簡単に表示できます。コントラスト比が300:1の場合は、すべてのレベルに対応できます。 s色。

ウェーバーの法則(感覚閾値の法則):[2]  同じ種類の刺激では、刺激の人々は動的範囲が標準的な刺激の強度に比例していると感じることができます。K= δI / I  Kは与えられた刺激で一定であり、Iは刺激、ΔIは感じることができる刺激の動的範囲です。

人間の視覚刺激に適用され、ウェーバーのコントラストを次のように定義します

Iは、被写体の明るさであり、そしてIのBは、バックグラウンドの全体的な明るさです。

マイケルソンコントラスト

マイケルソン[3]  コントラストは「可視性」とも呼ばれ、次のように定義されます。

 合計がどこに

それぞれ最も明るい明るさと最も暗い明るさを表します。ミシェルソンのコントラストは、人間の視覚体験における光フラックスフィールドの空間周波数に対するコーンセルの知覚の程度と理論的に一致しています。

Rmsコントラスト

Peliは、1990年に、コンテンツの空間周波数および空間分布とは関係のない画像のコントラストを、ラスター画像のピクセル値の[4]ルート平均二乗(つまり、標準偏差)として定義することを提案しまし  

その中で

幅と高さがそれぞれwとhのラスターイメージを記述します。

画像内の指定された位置にあるピクセルの値です。

 画像の明るさ(平均ピクセル)です、

 ある根二乗平均コントラスト(ピクセル標準偏差)。

デジタル画像変換の場合、元のピクセルのグレースケールが f(i、j)で、変換されたピクセルのグレースケールが g(i、j)であるとすると、一般的に使用される線形変換は g(i、j)= af(i、j)です。 )+ b、ここで、係数aは画像のコントラストに影響し、係数bは画像の明るさに影響します。
(1)a = 1の場合、元の画像です。
(2)a> 1の場合、コントラストが強調され、画像がより鮮明に見えます。
( 3)a <1の場合、コントラストが低下し、画像が暗く見えます。
(4)bは画像の明るさに影響し、b(b> 0)が増加し、b(b> 0)が減少すると、画像全体のグレー値になります。下に移動または下に移動します。つまり、画像全体が明るくなったり暗くなったりし、画像のコントラストは変わりません。

2.練習

#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;
}

参考資料:

付録1:saturate_castの役割

安全に変換するために、操作の結果がピクセル値の範囲を超える(オーバーフロー)か、整数でない場合があります(浮動小数点数の場合)。saturate_castを使用して結果を変換し、有効な値であることを確認します。

おすすめ

転載: blog.csdn.net/a8039974/article/details/104862821