opencv对比度增强方法算法汇总

1、线性变换

线性变化是最好理解的,假设原图为srcimg , 变换后的图像为dstimg,则:

dstimg = a * srcimg +b

a为变换系数,如果a>1 ,则输出图像的对比度增大,当0<a<1则对比度有所减小,b值影响图像的亮度,当b>0时,图像亮度增加,b<0图像亮度减小;

cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    Mat srcImg = imread("D:\\1.jpg");
    if(srcImg.empty())
    {
        QMessageBox::information(this,"警告","图片读取失败,请检查图片路径!");
        return;
    }
    Mat imgShow ;
    cvtColor(srcImg, imgShow, COLOR_BGR2RGB); // 图像格式转换
    QImage qImg = QImage((unsigned char*)(imgShow.data), imgShow.cols,
                         imgShow.rows, imgShow.cols*imgShow.channels(), QImage::Format_RGB888);
    ui->label->resize(qImg.width()/2 , qImg.height()/2);
    ui->label->setPixmap(QPixmap::fromImage(qImg.scaled(ui->label->size(), Qt::KeepAspectRatio)));
}


void MainWindow::on_pushButton_3_clicked()
{
    Mat srcImg = imread("D:\\1.jpg");
    if(srcImg.empty())
    {
        QMessageBox::information(this,"警告","图片读取失败,请检查图片路径!");
        return;
    }
    srcImg =0.8 *srcImg -10;
    Mat imgShow ;
    cvtColor(srcImg, imgShow, COLOR_BGR2RGB); // 图像格式转换
    QImage qImg = QImage((unsigned char*)(imgShow.data), imgShow.cols,
                         imgShow.rows, imgShow.cols*imgShow.channels(), QImage::Format_RGB888);
    ui->label_2->resize(qImg.width()/2 , qImg.height()/2);
    ui->label_2->setPixmap(QPixmap::fromImage(qImg.scaled(ui->label_2->size(), Qt::KeepAspectRatio)));
}

2、分段线性变换

分段性变换实在线性变换的基础上进行分段处理,分段是根据灰度值进行区分:

dstimg =0 if灰度值<50

dstimg = srcimg - 50 if 50<灰度值<150

dstimg = 0.1*srcimg if灰度值>150

cpp 复制代码
void MainWindow::on_pushButton_4_clicked()
{
    Mat srcImg = imread("D:\\1.jpg");
    if(srcImg.empty())
    {
        QMessageBox::information(this,"警告","图片读取失败,请检查图片路径!");
        return;
    }
    for(int i=0;i<srcImg.rows;++i)
    {
        uchar*ptr = srcImg.ptr<uchar>(i);

        for(int j =0;j<srcImg.cols;++j)
        {
            for(int m=0;m<3;++m)
            {
                if(ptr[j*3+m]<50)
                {
                    ptr[j*3+m] = 0;
                }
                else if(ptr[j*3+m]>150)
                {
                    ptr[j*3+m] = ptr[j*3+m] - 50;
                }
                else
                {
                    ptr[j*3+m] = 0.1*ptr[j*3+m];
                }
            }

        }
    }
    Mat imgShow ;
    cvtColor(srcImg, imgShow, COLOR_BGR2RGB); // 图像格式转换

    QImage qImg = QImage((unsigned char*)(imgShow.data), imgShow.cols,
                         imgShow.rows, imgShow.cols*imgShow.channels(), QImage::Format_RGB888);
    ui->label_2->resize(qImg.width()/2 , qImg.height()/2);
    ui->label_2->setPixmap(QPixmap::fromImage(qImg.scaled(ui->label_2->size(), Qt::KeepAspectRatio)));
}

3、伽马变换

伽马变换,就是对原图灰度值进行幂运算,比如2次方,3次方,0.5次方。。。

1、将原图归一化到【0,1】

2、开始幂运算

3、归一化到【0,255】

cpp 复制代码
void MainWindow::on_pushButton_5_clicked()
{
    Mat srcImg = imread("D:\\1.jpg",0);
    if(srcImg.empty())
    {
        QMessageBox::information(this,"警告","图片读取失败,请检查图片路径!");
        return;
    }

    //1、直接便利像素
    for(int i=0;i<srcImg.rows;++i)
    {
        uchar*ptr = srcImg.ptr<uchar>(i);

        for(int j =0;j<srcImg.cols;++j)
        {
            //归一化
            double s = ptr[j]/255.0;
            double t = pow(s,2);
            //扩展到255
            ptr[j] = 255*t;
        }
    }

    //2、调用接口
    //灰度归一化
    // srcImg.convertTo(srcImg , CV_64F , 1.0/255);
    // Mat dstImg;
    // cv::pow(srcImg , 2,dstImg);
    // dstImg.convertTo(srcImg , CV_8U , 255,0);

    QImage qImg = QImage((unsigned char*)(srcImg.data), srcImg.cols,
                         srcImg.rows, srcImg.cols*srcImg.channels(), QImage::Format_Grayscale8);
    ui->label_2->resize(qImg.width()/2 , qImg.height()/2);
    ui->label_2->setPixmap(QPixmap::fromImage(qImg.scaled(ui->label_2->size(), Qt::KeepAspectRatio)));
}

4、直方图正规化

假设图像 A 中灰度范围【50,100】 , 将其灰度值按照特特定公式拉伸到图像B【0,255】或者任意其他值,比如【0,100】 , 【100,200】 , 这就叫直方图正规化

公式如下:a = (Bmax - Bmin)/(Amax - Amin) b = Bmin-aAmin;
dstimg = a
srcimg +b;

opencv自带函数 normalize()

cpp 复制代码
void MainWindow::on_pushButton_6_clicked()
{
    Mat srcImg = imread("D:\\1.jpg",0);
    if(srcImg.empty())
    {
        QMessageBox::information(this,"警告","图片读取失败,请检查图片路径!");
        return;
    }
    normalize(srcImg , srcImg,255,150 , NORM_MINMAX);

    QImage qImg = QImage((unsigned char*)(srcImg.data), srcImg.cols,
                         srcImg.rows, srcImg.cols*srcImg.channels(), QImage::Format_Grayscale8);
    ui->label_2->resize(qImg.width()/2 , qImg.height()/2);
    ui->label_2->setPixmap(QPixmap::fromImage(qImg.scaled(ui->label_2->size(), Qt::KeepAspectRatio)));
}

5、直方图均衡化

直方图均衡化本质就是平衡图像内的灰度值,避免灰度值扎堆,而将其分散

cpp 复制代码
void MainWindow::on_pushButton_7_clicked()
{
    Mat srcImg = imread("D:\\3.jpg",0);
    if(srcImg.empty())
    {
        QMessageBox::information(this,"警告","图片读取失败,请检查图片路径!");
        return;
    }
    //normalize(srcImg , srcImg,255,150 , NORM_MINMAX);
    equalizeHist(srcImg , srcImg);

    QImage qImg = QImage((unsigned char*)(srcImg.data), srcImg.cols,
                         srcImg.rows, srcImg.cols*srcImg.channels(), QImage::Format_Grayscale8);
    ui->label_2->resize(qImg.width()/4 , qImg.height()/4);
    ui->label_2->setPixmap(QPixmap::fromImage(qImg.scaled(ui->label_2->size(), Qt::KeepAspectRatio)));
}

6、局部自适应直方图均衡化

自适应直方图均衡化首先将图像划分成不重叠的区域块,然后对每一块分别进行直方图均衡化,在没有噪声影响的情况下,每一个区域的灰度直方图都会被限制在一个小的灰度级内,但是若要存在噪声,经过局部直方图均衡化后,噪声将会被放大,为了避免这种情况,提出了限制对比度,如果直方图的bin超过了预先设置的阈值,那么将会被裁掉,然后将裁掉的部分平均分给其他bin , 这样就重构了直方图,避免噪声的影响

cpp 复制代码
void MainWindow::on_pushButton_8_clicked()
{
    Mat srcImg = imread("D:\\5.jpg",0);
    if(srcImg.empty())
    {
        QMessageBox::information(this,"警告","图片读取失败,请检查图片路径!");
        return;
    }
    //normalize(srcImg , srcImg,255,150 , NORM_MINMAX);
    // equalizeHist(srcImg , srcImg);
    Ptr<CLAHE> clahe =  createCLAHE(2.0 , Size(8,8));
    clahe->apply(srcImg , srcImg);


    QImage qImg = QImage((unsigned char*)(srcImg.data), srcImg.cols,
                         srcImg.rows, srcImg.cols*srcImg.channels(), QImage::Format_Grayscale8);
    ui->label_2->resize(qImg.width()/2 , qImg.height()/2);
    ui->label_2->setPixmap(QPixmap::fromImage(qImg.scaled(ui->label_2->size(), Qt::KeepAspectRatio)));
}
相关推荐
qzhqbb3 小时前
基于统计方法的语言模型
人工智能·语言模型·easyui
冷眼看人间恩怨3 小时前
【话题讨论】AI大模型重塑软件开发:定义、应用、优势与挑战
人工智能·ai编程·软件开发
2401_883041083 小时前
新锐品牌电商代运营公司都有哪些?
大数据·人工智能
pianmian13 小时前
python数据结构基础(7)
数据结构·算法
AI极客菌4 小时前
Controlnet作者新作IC-light V2:基于FLUX训练,支持处理风格化图像,细节远高于SD1.5。
人工智能·计算机视觉·ai作画·stable diffusion·aigc·flux·人工智能作画
阿_旭4 小时前
一文读懂| 自注意力与交叉注意力机制在计算机视觉中作用与基本原理
人工智能·深度学习·计算机视觉·cross-attention·self-attention
王哈哈^_^4 小时前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt
Power20246665 小时前
NLP论文速读|LongReward:基于AI反馈来提升长上下文大语言模型
人工智能·深度学习·机器学习·自然语言处理·nlp
数据猎手小k5 小时前
AIDOVECL数据集:包含超过15000张AI生成的车辆图像数据集,目的解决旨在解决眼水平分类和定位问题。
人工智能·分类·数据挖掘
好奇龙猫5 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法