下面是详细讲解“OpenCV调整图像亮度对比度的示例代码”的完整攻略。
1. 调整图像亮度
方法一:使用cv::Mat对像素值进行遍历
对于一张图像,我们可以通过遍历所有像素的方式调整图像的亮度,具体代码如下:
cv::Mat image = cv::imread("image.png"); // 读取图片
// 调整亮度
float alpha = 1.5; // 亮度调整参数
for (int i = 0; i < image.rows; i++) {
for (int j = 0; j < image.cols; j++) {
for (int c = 0; c < image.channels(); c++) {
image.at<cv::Vec3b>(i, j)[c] = cv::saturate_cast<uchar>(alpha * image.at<cv::Vec3b>(i, j)[c]);
}
}
}
cv::imshow("image", image); // 显示图片
cv::waitKey(); // 等待按键
这段代码中,我们通过三重循环遍历了所有像素,并对每个像素的RGB值进行乘法运算,将图像的亮度进行了调整。
方法二:使用cv::convertTo函数
除了遍历像素值之外,还可以使用OpenCV提供的函数cv::convertTo来调整图像亮度,代码如下:
cv::Mat image = cv::imread("image.png"); // 读取图片
// 调整亮度
float alpha = 1.5; // 亮度调整参数
cv::Mat bright_image;
image.convertTo(bright_image, -1, alpha, 0);
cv::imshow("image", bright_image); // 显示图片
cv::waitKey(); // 等待按键
这段代码中,我们使用convertTo函数将原图像赋值给一个新的Mat对象bright_image,并将alpha和0作为参数传入convertTo函数中,从而实现对图像亮度的调整,其中第二个参数-1表示使用与原图像相同的深度和通道数。
2. 调整图像对比度
方法一:使用cv::Mat对像素值进行遍历
同样地,我们也可以通过遍历图像的每一个像素,来实现对图像对比度的调整,代码如下:
cv::Mat image = cv::imread("image.png"); // 读取图片
// 调整对比度
float alpha = 1.5; // 对比度调整参数
for (int i = 0; i < image.rows; i++) {
for (int j = 0; j < image.cols; j++) {
for (int c = 0; c < image.channels(); c++) {
image.at<cv::Vec3b>(i, j)[c] = cv::saturate_cast<uchar>(alpha * (image.at<cv::Vec3b>(i, j)[c] - 128) + 128);
}
}
}
cv::imshow("image", image); // 显示图片
cv::waitKey(); // 等待按键
这段代码的原理为:对于原图像中的每一个像素,减去128后,与调整参数alpha相乘,并加上128,将调整后的像素值赋值给新的Mat对象。
方法二:使用cv::equalizeHist函数
cv::equalizeHist函数用于直方图均衡化,同样可以实现对图像对比度的调整,具体代码如下:
cv::Mat image = cv::imread("image.png", cv::IMREAD_GRAYSCALE); // 读取灰度图像
// 直方图均衡化
cv::Mat equalized_image;
cv::equalizeHist(image, equalized_image);
cv::imshow("image", equalized_image); // 显示图片
cv::waitKey(); // 等待按键
这段代码的原理为:使用cv::equalizeHist函数对输入的灰度图像进行直方图均衡化,得到调整后的灰度图像,即为对比度调整后的图像。
总结
本篇攻略详细讲解了两种调整图像亮度和对比度的方法,并给出了具体的代码实现。其中,第一种方法需要使用循环遍历每一个像素,而第二种方法则利用了OpenCV提供的现成函数,实现了快速调整的目的。在实际使用中,需要根据实际情况选择合适的方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:opencv调整图像亮度对比度的示例代码 - Python技术站