c++ OpenCV 图像亮度的计算方法 代码

参考https://blog.csdn.net/weixin_39609623/article/details/95306158
稍加修改
第一次学习使用openCV,有错误请不吝指教

1. 方法一

计算图片各个通道的亮度后求的均值

float lightMean(cv::Mat img)
{
	cv::Scalar scalar = cv::mean(img);
	float imgChannel1 = scalar.val[0];
	float imgChannel2 = scalar.val[1];
	float imgChannel3 = scalar.val[2];
	//float imgChannel4 = scalar.val[3];
	//qDebug() << "--4.method mean picture Light : " << QString::number(picMeanLight, 10, 4);
	float imgLight = (imgChannel1 + imgChannel2 + imgChannel3) / 3;
	return imgLight;
}

2. 方法二
在这里插入图片描述

//根据hsl中l=(max(R,G,B)+min(R,G,B))/2
//用cv::mean()分别计算R,G,B三通道平均值,最大、最小值求Light分量作为亮度
float lightHSL(cv::Mat img)
{
	cv::Scalar scalarHSL = cv::mean(img);
	double imgMax = cv::max(scalarHSL.val[0], scalarHSL.val[1]);
	imgMax = cv::max(imgMax, scalarHSL.val[2]);
	double imgMin = cv::min(scalarHSL.val[0], scalarHSL.val[1]);
	imgMin = cv::min(imgMin, scalarHSL.val[2]);
	float hslLight = (imgMax + imgMin) / 2;
	return hslLight;
}

3. 方法三
转为灰度图片,计算像素平均值作为亮度

float lightGray(cv::Mat img)
{
	cv::Mat imgGray;
	cv::cvtColor(img, imgGray, CV_BGR2GRAY);
	cv::Scalar grayScalar = cv::mean(imgGray);
	float imgGrayLight = grayScalar.val[0];
	return imgGrayLight;
}

测试

int main()
{
	cv::Mat imgTest;
	imgTest = cv::imread("D:\\A_testdata\\binary_tif\\testjpg.jpg");
	//算亮度
	float picLight = lightMean(imgTest);
	float picLight = lightHSL(imgTest);
	float picLight = lightGray(imgTest);
	
    waitKey(0);
    return 0;
}
  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
彩色图像的自动亮度调整可以通过以下步骤实现: 1. 将彩色图像转换为灰度图像。 2. 计算灰度图像的直方图,获取像素范围和像素数量分布情况。 3. 找到直方图中的最小像素和最大像素。 4. 根据最小像素和最大像素,计算出调整后的最小像素和最大像素。 5. 对原始彩色图像进行像素的重新映射,将最小像素映射到调整后的最小像素,将最大像素映射到调整后的最大像素,同时将中间像素按比例进行映射。 以下是OpenCV C++代码示例: ```c++ #include <opencv2/opencv.hpp> using namespace cv; int main() { // 读取彩色图像 Mat img = imread("test.jpg"); // 转换为灰度图像 Mat grayImg; cvtColor(img, grayImg, COLOR_BGR2GRAY); // 计算灰度图像的直方图 int histSize[] = {256}; float range[] = {0, 256}; const float* ranges[] = {range}; Mat hist; calcHist(&grayImg, 1, 0, Mat(), hist, 1, histSize, ranges); // 找到直方图中的最小像素和最大像素 int minGray = 0, maxGray = 255; for (int i = 0; i < 256; ++i) { if (hist.at<float>(i) > 0) { minGray = i; break; } } for (int i = 255; i >= 0; --i) { if (hist.at<float>(i) > 0) { maxGray = i; break; } } // 计算调整后的最小像素和最大像素 int minDst = 50, maxDst = 200; int deltaSrc = maxGray - minGray; int deltaDst = maxDst - minDst; double scale = deltaDst / static_cast<double>(deltaSrc); int shift = minDst - static_cast<int>(minGray * scale + 0.5); // 对原始彩色图像进行像素的重新映射 Mat dstImg; img.convertTo(dstImg, -1, scale, shift); // 显示原始图像和调整后的图像 imshow("Original Image", img); imshow("Adjusted Image", dstImg); waitKey(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值