OpenCV開發筆記(十三):OpenCV圖像對比度、亮度的調整

若該文爲原創文章,未經允許不得轉載
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客導航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/104427405

目錄

前言

相關博客

Demo演示效果

對比度

亮度

算子與計算對比度亮度計算公式

算子的概念

對比度和亮度計算公式

Demo源碼

工程模板:對應版本號v1.8.0

入坑

入坑一:滾動條拽託不動


OpenCV開發專欄

OpenCV開發筆記(〇):使用mingw530_32編譯openCV3.4.1源碼,搭建Qt5.9.3的openCV開發環境

OpenCV開發筆記(一):OpenCV介紹、編譯

OpenCV開發筆記(二):cvui交互界面

OpenCV開發筆記(三):OpenCV圖像的概念和基本操作

OpenCV開發筆記(四):OpenCV圖片和視頻數據的讀取與存儲

OpenCV開發筆記(五):OpenCV讀取與操作攝像頭

OpenCV開發筆記(六):OpenCV基礎數據結構、顏色轉換函數和顏色空間

OpenCV開發筆記(七):OpenCV基礎圖形繪製

OpenCV開發筆記(八):OpenCV常用操作之計時、縮放、旋轉、鏡像

OpenCV開發筆記(九):OpenCV區域圖像(ROI)和整體、局部圖像混合

OpenCV開發筆記十):OpenCV圖像顏色通道分離和圖像顏色多通道混合

OpenCV開發筆記(十一):OpenCV編譯支持Gpu(cuda) 加速開發之win-qt-mingw32編譯

OpenCV開發筆記(十二):OpenCV編譯支持Gpu(cuda) 加速開發之win-qt-msvc2015編譯(opencv3.4.0、cuda9.0、VS2015)

OpenCV開發筆記(十三):OpenCV圖像對比度、亮度的調整

持續補充中…

 

    OpenCV開發筆記(十三):OpenCV圖像對比度、亮度的調整

 

前言

      對圖像本身的像素點進行對比和亮度的調整。

 

相關博客

      《OpenCV開發筆記(五):OpenCV讀取與操作攝像頭》中可以對攝像頭採集的圖像進行對比度、亮度、曝光度等的調整,但是需要攝像頭硬件本身支持,而本篇是直接對圖像進行處理。

 

Demo演示效果

 

對比度

對比度指的是一幅圖像中明暗區域最亮的白和最暗的黑之間不同亮度層級的測量,差異範圍越大代表對比越大,差異範圍越小代表對比越小,好的對比率120:1就可容易地顯示生動、豐富的色彩,當對比率高達300:1時,便可支持各階的顏色。但對比率遭受和亮度相同的困境,現今尚無一套有效又公正的標準來衡量對比率,所以最好的辨識方式還是依靠使用者眼睛。

 

亮度

      亮度是指畫面的明亮程度,單位是堪德拉每平米(cd/m2)或稱nits,也就是每平方公尺分之燭光。當前提高顯示屏亮度的方法有兩種,一種是提高LCD面板的光通過率;另一種就是增加背景燈光的亮度。

      轉換爲RGB圖像中對亮度的操作就是對每個值加一個固定值。

 

算子與計算對比度亮度計算公式

算子的概念

      一般的圖像處理算子(我們理解爲計算公式)都是一個函數,接收一個或多個輸入圖像,併產生輸出圖像。

      下面是算子的一般形式:

      g(x) = h( f(x) ) 或者 g(x) = h( f0(x) ……fn(x) )

對比度和亮度計算公式

      g(x, y) = f(x, y) * alpha + beta;

      其中:f(x, y)代表原圖像某個點的像素顏色值;alpha代表對比度值;beta代表亮度值;

      此處因爲在實際的開發過程中,需要喜歡調整的對比度和亮度的方法:

      g(x, y) = f(x, y) * (alpha / 100.0f) + beta

      對比度範圍0~400(筆者選取的),分母爲1000.0f;

      亮度範圍-255~255(筆者選取的),無分母(可認爲分母爲1.0f);

 

Demo源碼

void OpenCVManager::testContrastAndBrightness()
{
    cv::Mat mat1;
    QString fileName1 = "E:/qtProject/openCVDemo/openCVDemo/modules/openCVManager/images/1.jpg";
    mat1 = cv::imread(fileName1.toStdString());

    cv::String windowName = "openCVDemo v1.8.0";
    cvui::init(windowName);

    if(!mat1.data)
    {
        qDebug() << __FILE__ << __LINE__
                 << "Failed to load image:" << fileName1;
        return;
    }
    // 增強對比度
    float r;
    float g;
    float b;
    cv::Mat dstMat;
    dstMat = cv::Mat::zeros(mat1.size(), mat1.type());
    cv::Mat windowMat = cv::Mat(cv::Size(dstMat.cols * 2, dstMat.rows), CV_8UC3);
    int alpha = 100;    // 小於1,則降低對比度
    int beta = 0;     // 負數,則降低亮度
    cvui::window(windowMat, dstMat.cols, 0, dstMat.cols, dstMat.rows, "settings");
    while(true)
    {
        windowMat = cv::Scalar(0, 0, 0);
        cvui::printf(windowMat, 375, 40, "contrast");
        cvui::trackbar(windowMat, 375, 50, 165, &alpha, 0, 400);
        cvui::printf(windowMat, 375, 100, "brightness");
        cvui::trackbar(windowMat, 375, 110, 165, &beta, -255, 255);
#if 1
        for(int row = 0; row < mat1.rows; row++)
        {
            for(int col = 0; col < mat1.cols; col++)
            {
                b = mat1.at<cv::Vec3b>(row, col)[0];
                g = mat1.at<cv::Vec3b>(row, col)[1];
                r = mat1.at<cv::Vec3b>(row, col)[2];
#if 0
                // 改變背景色
                if(r > 200 && g > 200 && b > 200)
                {
                    r = 25/4.0;
                    g = 246.0f;
                    b = 197.0f;
                    dstMat.at<cv::Vec3b>(row, col)[0] = b;
                    dstMat.at<cv::Vec3b>(row, col)[1] = g;
                    dstMat.at<cv::Vec3b>(row, col)[2] = r;
                }
#endif
#if 1
                // 對比度、亮度計算公式 cv::saturate_cast<uchar>(value):防止溢出
                dstMat.at<cv::Vec3b>(row, col)[0] = cv::saturate_cast<uchar>(b * alpha / 100.0f + beta);
                dstMat.at<cv::Vec3b>(row, col)[1] = cv::saturate_cast<uchar>(g * alpha / 100.0f + beta);
                dstMat.at<cv::Vec3b>(row, col)[2] = cv::saturate_cast<uchar>(r * alpha / 100.0f + beta);
#else
                // 對比度、亮度計算公式 cv::saturate_cast<uchar>(value):防止溢出
                dstMat.at<cv::Vec3b>(row, col)[0] = cv::saturate_cast<uchar>(b * alpha / 100.0f + beta);
                dstMat.at<cv::Vec3b>(row, col)[1] = cv::saturate_cast<uchar>(g * alpha / 100.0f + beta);
                dstMat.at<cv::Vec3b>(row, col)[2] = cv::saturate_cast<uchar>(r * alpha / 100.0f + beta);
#endif
            }
        }
//        cvui::trackbar(windowMat, dstMat.cols, dstMat.rows / 3, dstMat.cols, &?alpha, 0, 100, );
        cv::Mat imageMat = windowMat(cv::Range(0, dstMat.rows), cv::Range(0, dstMat.cols));
        cv::addWeighted(imageMat, 0.0, dstMat, 1.0, 0.0f, imageMat);
#endif
        cvui::update();
        cv::imshow(windowName, windowMat);
        if(cv::waitKey(25) == 27)
        {
            break;
        }
    }
}

 

工程模板:對應版本號v1.8.0

      對應版本號v1.8.0

 

入坑

入坑一:滾動條拽託不動

原因:

      沒有留間隔循環獲取。

解決方法:

 

原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客導航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/104427405

發佈了231 篇原創文章 · 獲贊 248 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章