opencv学习记录06:调整图像亮度和对比度

1、图像亮度和对比度理论部分在这里插入图片描述

注:图片来自51CTO学院网课

2、处理步骤

先将图片处理成(0,0,0)的黑色图片,然后再根据像素变换操作进行处理:
处理三通道:
1、分别对每个通道进行像素变换操作

	for (int row = 0; row < height; row++) {
		for (int col = 0; col < width; col++) {
			if (src.channels() == 3) {
				float b = m1.at<Vec3f>(row, col)[0];// blue
				float g = m1.at<Vec3f>(row, col)[1]; // green
				float r = m1.at<Vec3f>(row, col)[2]; // red

				// output
				dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b * alpha + beta);
				dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g * alpha + beta);
				dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r * alpha + beta);
			}

处理单通道:
1.先将一张三通道彩色图片转换成灰度图像
2.对灰度图像进行像素变换操作

				float v = src.at<uchar>(row, col);
				dst.at<uchar>(row, col) = saturate_cast<uchar>(v * alpha + beta);

代码:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

void Myshow(string name, const Mat& result);

int main() {
	Mat src, dst;
	src = imread("F:\\opencv_work\\07增强亮度和对比度\\Project1\\18.jpg");
	if (src.empty()) {
		printf("could not load image...\n");
		return -1;
	}
	char input_win[] = "输入图片";
	cvtColor(src, src, COLOR_BGR2GRAY);
	namedWindow(input_win, WINDOW_AUTOSIZE);
	imshow(input_win, src);

	// contrast and brigthtness changes 
	int height = src.rows;
	int width = src.cols;
	dst = Mat::zeros(src.size(), src.type());
	float alpha = 1.2;
	float beta = 30;

	Mat m1;
	src.convertTo(m1, CV_32F);
	for (int row = 0; row < height; row++) {
		for (int col = 0; col < width; col++) {
			if (src.channels() == 3) {
				float b = m1.at<Vec3f>(row, col)[0];// blue
				float g = m1.at<Vec3f>(row, col)[1]; // green
				float r = m1.at<Vec3f>(row, col)[2]; // red

				// output
				dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b * alpha + beta);
				dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g * alpha + beta);
				dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r * alpha + beta);
			}
			else if (src.channels() == 1) {
				float v = src.at<uchar>(row, col);
				dst.at<uchar>(row, col) = saturate_cast<uchar>(v * alpha + beta);
			}
		}
	}

	char output_title[] = "舵主的增强亮度和对比度图片";
	/*namedWindow(output_title, WINDOW_AUTOSIZE);
	imshow(output_title, dst);*/

	Myshow(output_title, dst);

	waitKey(0);
	return 0;
}
void Myshow(string name, const Mat& result)
{
	namedWindow(name, WINDOW_FREERATIO);
	imshow(name, result);
}

猜你喜欢

转载自blog.csdn.net/Cai_Xu_Kun/article/details/107645824