原理:
假设输入图像为A,输出图像为B,图像的线性变换提高对比度的公式可以定义为:
B(r,c)=aA(r,c)+b*
其中r,c是图像的像素坐标点,a为变换系数,b为初始添加值

C++:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main()
{
	Mat img,dst;
	//加载图像
	img=imread("D:/woman.jpg");
	if (img.empty())
	{
		cout << "输入图像错误" << endl;
		return -1;
	};
	imshow("original image", img);
	
	//获取图像宽和高
	int height = img.rows;
	int width = img.cols;
	//初始化空白图像
	dst.create(img.size(), img.type());
	//像素范围在0~255中越来越亮
	int original_pixel = 30;		//像素提高的数值
	double original_alpha = 1.3;	//像素提高的比例系数
	for (int i=0;i<height;i++) 
	{
		for (int j = 0; j < width; j++)
		{
			int B = img.at<Vec3b>(i, j)[0];
			int G = img.at<Vec3b>(i, j)[1];
			int R = img.at<Vec3b>(i, j)[2];
			//saturate_cast函数保证输入的像素值控制在0~255,从而不会越界
			dst.at<Vec3b>(i, j)[0] = saturate_cast<uchar>(B*original_alpha + original_pixel);
			dst.at<Vec3b>(i, j)[1] = saturate_cast<uchar>(G*original_alpha + original_pixel);
			dst.at<Vec3b>(i, j)[2] = saturate_cast<uchar>(R*original_alpha + original_pixel);
		};
	};

	imshow("enhanced image",dst);
	waitKey(0);
	return 0;
};

Python:

import cv2 as cv
import numpy as np

##读取图像
img = cv.imread('D:/woman.jpg')
cv.imshow("original image",img)
##读取图像高宽和通道数
height,width,channel=img.shape
##初始化空白图像和系数
enhanced_image=np.zeros(img.shape,dtype=np.float64)
#    float类型是因为后面系数是含有小数点;假如某一像素值是180,在uint8类型(整型)下,转化为180*1.5+30=300
#    300%256=44(转化后的像素值);所以应该在float64类型下。
original_pixel=30
original_alpha=1.5
#方法一(直接用矩阵去运算)
#enhanced_image=img*original_alpha+original_pixel

#方法二(通过访问像素运算)
for r in range(height):
    for c in range(width):
        B = img[r, c][0]
        G = img[r, c][1]
        R = img[r, c][2]
        enhanced_image[r ,c][0] = B * original_alpha + original_pixel
        enhanced_image[r, c][1] = G * original_alpha + original_pixel
        enhanced_image[r, c][2] = R * original_alpha + original_pixel


enhanced_image[enhanced_image>255]=255  #对大于255的值截断为255
enhanced_image=np.round(enhanced_image) #取整
enhanced_image=enhanced_image.astype(np.uint8)  #最后转化为0~255之间


cv.imshow("enhanced image",enhanced_image)
cv.waitKey(0)
cv.destroyAllWindows()

结果显示:
中间的为正常图

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐