1. 理論的根拠
g(i,j) = アルファ * f(i,j) + ベータ
このうち、i、jは画素のi行j列を表します。g(i,j) は出力画像のピクセル、alpha はコントラスト制御係数、beta は明るさ制御係数です。
もちろん、ピクセルの一部の値を変更するには、ピクセル値にアクセスする必要があります。Opencv には、ピクセルにアクセスするいくつかのメソッドが用意されています。3 チャネルの画像ピクセルの場合は、 m_srcMat.at(i, j)[0] //B にアクセス
します
m_srcMat.at(i,j) )[1] //G
m_srcMat.at(i,j)[2] //R
2.コアコード
int m_nContrastValue = 100; //对比度值
int m_nBrightValue = 0; //亮度值
Mat m_srcMat,m_dstMat; //原图像、输出图像
void BrightContrast::changeBrightContrast()
{
double alpha = m_nContrastValue*0.01;
int beta = m_nBrightValue;
int ch = m_srcMat.channels();
qDebug("alpha= %lf,beta= %d",alpha,beta);
#if 0
//m_dstMat(i,j) = alpha*m_srcMat(i,j) + beta
for(int row=0;row<m_srcMat.rows;row++)
{
for(int col=0;col<m_srcMat.cols;col++)
{
if(ch == 3)
{
for(int c=0;c<3;c++)
{
m_dstMat.at<Vec3b>(row,col)[c] = saturate_cast<uchar>(alpha*(m_srcMat.at<Vec3b>(row,col)[c]) + beta);
}
}
}
}
#else
m_srcMat.convertTo(m_dstMat, -1, alpha, beta);
#endif
bgrMat2Image(m_dstMat);
}
ここでは 2 つの方法を示します。
方法 1: for ループを使用してピクセルごとに操作します。
方法 2: 関数 void ConvertTo(OutputArray m, int rtype, double alpha=1, double beta=0) const; m:
出力結果を示します
rtype: -1 は元の画像と同じであることを示します
alpha: スケール変換係数
beta : スケール変換係数オフセット
3.エフェクト表示
デモリンクを投稿しました。https:
//download.csdn.net/download/haohaohaihuai/12442739を参照してください。
著者: Feima Programmer
技術交流へようこそ: QQ: 255895056
転載の際は出典を明記し、不適切な点があれば修正してください