Ajuste de brilho e contraste da imagem Qt + opencv
1. Base teórica
g(i,j) = alfa * f(i,j) + beta
Entre eles, i e j representam a i-ésima linha e a j-ésima coluna do pixel. g(i,j) é o pixel da imagem de saída, alfa é o coeficiente de controle de contraste e beta é o coeficiente de controle de brilho.
Claro, para alterar alguns valores de pixels, você precisa acessar os valores dos pixels. Opencv fornece alguns métodos de acesso aos pixels. Para pixels de imagem de 3 canais, acesse m_srcMat.at(i, j
)[0] //B
m_srcMat.at(i,j) )[1] //G
m_srcMat.at(i,j)[2] //R
2. Código principal
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);
}
Aqui estão 2 métodos mostrados:
Método 1: Use um loop for para operar pixel por pixel.
Método 2: Use a função void convertTo(OutputArray m, int rtype, double alpha=1, double beta=0) const;
m: indica o resultado de saída
rtype: -1 indica o mesmo que a imagem original
alfa: fator de transformação de escala
beta : deslocamento do coeficiente de transformação de escala
3. Exibição de efeito
Postei o link da demonstração. Se você quiser dar uma olhada, pode consultar:
https://download.csdn.net/download/haohaohaihuai/12442739
Autor: Programador Feima.
Bem-vindo ao intercâmbio técnico: QQ: 255895056.
Por favor, indique a fonte para reimpressão. Se houver alguma inadequação, corrija-me.