OpenCV6---调整图片亮度和对比度

六、调整图片亮度和对比度
1、理论
图像变换可以看作如下:

  • 像素变换—点操作
  • 邻域操作—区域
    调整图像的亮度和对比度属于像素变换—点操作
    g(i , j) = α \alpha α* f(i , j) + β \beta β 其中 α \alpha α > 0, β \beta β是增益变量
    α \alpha α > 1会扩大两个像素值之间的差值,从而提高了图像的对比度,反之降低图像对比度; β \beta β值可以用来增大图片的亮度,值越大,图片亮度增加越明显。

2、对比度,与亮度提高代码实现

单通道灰度图像

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

三通道RGB图像

float b = src.at<Vec3b>(row, col)[0];//获取图片各个像素值
float g = src.at<Vec3b>(row, col)[1];
float r = src.at<Vec3b>(row, col)[2];
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);

若想进一步提高精度,可以使使读取的像素的数据类型都为float类型,即Vec3f,这里需要一个转换函数
src.convertTo(m1, CV_32F);
接下来便可以使用浮点类型

float b = m1.at<Vec3f>(row, col)[0];//Vec3f,读取数据类型为float型,需要用到convertTo函数
float g = m1.at<Vec3f>(row, col)[1];
float r = m1.at<Vec3f>(row, col)[2];

示例代码(改变图像的亮度和对比度):

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

using namespace cv;
using namespace std;

int main(int argc, char** argv) {
    Mat src, dst;
    src = imread("C:/Users/26839/Pictures/测试.png");
    if (src.empty()) {
        cout << "could not load image...\n" << endl;
        return -1;
    }
    //cvtColor(dst, src, COLOR_BGR2GRAY);//测试灰度图像
    imshow("input", src);
    
    int height = src.rows;
    int width = src.cols;
    dst = Mat::zero(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];
                float g = m1.at<Vec3f>(row, col)[1];
		float r = m1.at<Vec3f>(row, col)[2];
		
		dst.at<Vec3f>(row, col)[0] = saturate_cast<uchar>(b * alpha + beta);
                dst.at<Vec3f>(row, col)[1] = saturate_cast<uchar>(g * alpha + beta);
                dst.at<Vec3f>(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);
	       }
	  }
    }

    imshow("output", dst);
    waitKey(0);
    dstroyAllWindows();
    return 0;
}

运行输出结果如下:
单通道测试结果:
在这里插入图片描述

三通道测试结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴为您解答。您可以使用OpenCV库来实现Python滑块调整图片亮度对比度。下面是Python代码示例: ```python import cv2 import numpy as np def adjustBrightnessContrast(image, brightness, contrast): # 亮度调整 if brightness != 0: if brightness > 0: shadow = brightness highLight = 255 else: shadow = 0 highLight = 255 + brightness alpha_b = (highLight - shadow) / 255 gamma_b = shadow # 映射表 table_b = np.array([((i / 255) * alpha_b + gamma_b) if ((i / 255) * alpha_b + gamma_b) > 0 else 0 for i in range(0, 256)]).astype("uint8") image = cv2.LUT(image, table_b) # 对比度调整 if contrast != 0: f = 131 * (contrast + 127) / (127 * (131 - contrast)) alpha_c = f gamma_c = 127 * (1 - f) # 映射表 table_c = np.array([((i / 255) * alpha_c + gamma_c) if ((i / 255) * alpha_c + gamma_c) > 0 else 0 for i in range(0, 256)]).astype("uint8") image = cv2.LUT(image, table_c) return image # 读取图片 img = cv2.imread('test.jpg') # 创建窗口 cv2.namedWindow('image') # 创建滑块 cv2.createTrackbar('Brightness', 'image', 0, 100, lambda x: None) cv2.createTrackbar('Contrast', 'image', 0, 100, lambda x: None) while True: # 获取滑块值 brightness = cv2.getTrackbarPos('Brightness', 'image') - 50 contrast = cv2.getTrackbarPos('Contrast', 'image') - 50 # 调整亮度对比度 img_adjust = adjustBrightnessContrast(img, brightness, contrast) # 显示图片 cv2.imshow('image', img_adjust) # 按下Q键退出 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放窗口和摄像头 cv2.destroyAllWindows() ``` 您可以按照上述步骤来实现Python滑块调整图片亮度对比度。希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值