#include "opencv2/core/utility.hpp" // 包含OpenCV核心工具庫(kù)的頭文件
#include "opencv2/imgproc.hpp" // 包含OpenCV圖像處理的頭文件
#include "opencv2/imgcodecs.hpp" // 包含OpenCV圖像編碼解碼的頭文件
#include "opencv2/highgui.hpp" // 包含OpenCV高層GUI(圖形用戶界面)的頭文件
#include <iostream> // 包含標(biāo)準(zhǔn)輸入輸出流的頭文件
// 使用命名空間cv和std,避免每次調(diào)用OpenCV和標(biāo)準(zhǔn)庫(kù)函數(shù)時(shí)都需要前綴
using namespace cv;
using namespace std;
// 全局變量,分別用于存儲(chǔ)亮度和對(duì)比度的值
int _brightness = 100;
int _contrast = 100;
Mat image; // 全局變量,用于存儲(chǔ)圖像矩陣
/* 亮度/對(duì)比度調(diào)整回調(diào)函數(shù) */
static void updateBrightnessContrast( int /*arg*/, void* )
{
int histSize = 64; // 定義直方圖的大小
int brightness = _brightness - 100; // 計(jì)算新的亮度值
int contrast = _contrast - 100; // 計(jì)算新的對(duì)比度值
/*
* 使用Werner D. Streidt的算法來(lái)調(diào)整亮度和對(duì)比度
* (參見http://visca.com/ffactory/archives/5-99/msg00021.html)
*/
double a, b;
if( contrast > 0 )
{
double delta = 127.*contrast/100; // 計(jì)算對(duì)比度增量
a = 255./(255. - delta*2); // 根據(jù)對(duì)比度增量計(jì)算系數(shù)a
b = a*(brightness - delta); // 根據(jù)對(duì)比度增量和亮度計(jì)算系數(shù)b
}
else
{
double delta = -128.*contrast/100; // 計(jì)算對(duì)比度減量
a = (256.-delta*2)/255.; // 根據(jù)對(duì)比度減量計(jì)算系數(shù)a
b = a*brightness + delta; // 根據(jù)對(duì)比度減量和亮度計(jì)算系數(shù)b
}
Mat dst, hist; // 定義目標(biāo)圖像和直方圖矩陣
image.convertTo(dst, CV_8U, a, b); // 應(yīng)用亮度和對(duì)比度的調(diào)整并轉(zhuǎn)換圖像格式
imshow("image", dst); // 顯示調(diào)整后的圖像
// 計(jì)算調(diào)整后圖像的直方圖
calcHist(&dst, 1, 0, Mat(), hist, 1, &histSize, 0);
Mat histImage = Mat::ones(200, 320, CV_8U)*255; // 創(chuàng)建直方圖的圖像
// 對(duì)直方圖進(jìn)行歸一化操作
normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, CV_32F);
histImage = Scalar::all(255); // 設(shè)置直方圖圖像的背景為白色
int binW = cvRound((double)histImage.cols/histSize); // 計(jì)算每個(gè)bin的寬度
// 繪制直方圖
for( int i = 0; i < histSize; i++ )
rectangle( histImage, Point(i*binW, histImage.rows),
Point((i+1)*binW, histImage.rows - cvRound(hist.at<float>(i))),
Scalar::all(0), -1, 8, 0 );
imshow("histogram", histImage); // 顯示直方圖
}
// keys字符串定義了程序可以接受的命令行參數(shù)
const char* keys =
{
"{help h||}{@image|baboon.jpg|input image file}"
};
// 程序主函數(shù)
int main( int argc, const char** argv )
{
CommandLineParser parser(argc, argv, keys); // 創(chuàng)建命令行參數(shù)解析器
parser.about("\nThis program demonstrates the use of calcHist() -- histogram creation.\n");
if (parser.has("help")) // 如果提供了幫助標(biāo)志,則打印幫助信息
{
parser.printMessage();
return 0;
}
string inputImage = parser.get<string>(0); // 獲取輸入的圖像文件
// 讀取源圖像,使用高級(jí)GUI
image = imread(samples::findFile(inputImage), IMREAD_GRAYSCALE); // 以灰度模式讀取圖像
if(image.empty()) // 如果讀取圖像失敗,則打印錯(cuò)誤信息并退出
{
std::cerr << "Cannot read image file: " << inputImage << std::endl;
return -1;
}
// 創(chuàng)建顯示窗口
namedWindow("image", 0);
namedWindow("histogram", 0);
// 創(chuàng)建軌跡條以調(diào)整亮度和對(duì)比度,并設(shè)置回調(diào)函數(shù)
createTrackbar("brightness", "image", &_brightness, 200, updateBrightnessContrast);
createTrackbar("contrast", "image", &_contrast, 200, updateBrightnessContrast);
// 使用默認(rèn)值更新亮度和對(duì)比度
updateBrightnessContrast(0, 0);
waitKey(); // 等待用戶按鍵
return 0; // 程序正常退出
}
這段代碼是使用C++和OpenCV庫(kù)編寫的圖像處理程序,其主要功能是調(diào)整圖像的亮度和對(duì)比度,并在GUI窗口中實(shí)時(shí)顯示調(diào)整后的圖像以及其直方圖。用戶可以通過(guò)界面上的滑動(dòng)條來(lái)動(dòng)態(tài)地調(diào)整亮度和對(duì)比度參數(shù)從而觀察到圖像即時(shí)的變化效果。程序首先讀取并顯示一個(gè)灰度圖像,然后響應(yīng)用戶的交互輸入來(lái)更新圖像顯示和直方圖。
image.convertTo(dst, CV_8U, a, b);
calcHist(&dst, 1, 0, Mat(), hist, 1, &histSize, 0);
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-846293.html
normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, CV_32F);
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-846293.html
到了這里,關(guān)于【opencv】示例-demhist.cpp 調(diào)整圖像的亮度和對(duì)比度,并在GUI窗口中實(shí)時(shí)顯示調(diào)整后的圖像以及其直方圖。...的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!