实现原理
图像对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,即指一幅图像灰度反差的大小。差异范围越大代表对比越大,差异范围越小代表对比越小。设置一个基准值thresh,当percent大于0时,需要令图像中的颜色对比更强烈,即数值距离thresh越远,则变化越大;当percent等于1时,对比强到极致,只有255和0的区分;当percent等于0时,不变;当percent小于0时,对比下降,即令远离thresh的数值更近些;当percent等于-1时,没有对比了,全是thresh值。
对比度调整算法的实现流程如下:
1.设置调整参数percent,取值为-100到100,类似PS中设置,归一化后为-1到1。
2.针对图像所有像素点单个处理。当percent大于等于0时,对比增强,调整后的RGB三通道数值为:
3.若percent小于0时,对比降低,此时调整后的图像RGB三通道值为:
4.若percent等于1时,大于thresh则等于255,小于则等于0。
代码实现
function.h
#pragma once
#include <iostream>
#include <opencv2/highgui.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
Mat Contrast(Mat src, int percent);
function.cpp
#include "function.h"
// 对比度
Mat Contrast(Mat src, int percent)
{
float alpha = percent / 100.f;
alpha = max(-1.f, min(1.f, alpha));
Mat temp = src.clone();
int row = src.rows;
int col = src.cols;
int thresh = 127;
for (int i = 0; i < row; ++i)
{
uchar* t = temp.ptr<uchar>(i);
uchar* s = src.ptr<uchar>(i);
for (int j = 0; j < col; ++j)
{
uchar b = s[3 * j];
uchar g = s[3 * j + 1];
uchar r = s[3 * j + 2];
int newb, newg, newr;
if (alpha == 1)
{
t[3 * j + 2] = r > thresh ? 255 : 0;
t[3 * j + 1] = g > thresh ? 255 : 0;
t[3 * j] = b > thresh ? 255 : 0;
continue;
}
else if (alpha >= 0)
{
newr = static_cast<int>(thresh + (r - thresh) / (1 - alpha));
newg = static_cast<int>(thresh + (g - thresh) / (1 - alpha));
newb = static_cast<int>(thresh + (b - thresh) / (1 - alpha));
}
else {
newr = static_cast<int>(thresh + (r - thresh) * (1 + alpha));
newg = static_cast<int>(thresh + (g - thresh) * (1 + alpha));
newb = static_cast<int>(thresh + (b - thresh) * (1 + alpha));
}
newr = max(0, min(255, newr));
newg = max(0, min(255, newg));
newb = max(0, min(255, newb));
t[3 * j + 2] = static_cast<uchar>(newr);
t[3 * j + 1] = static_cast<uchar>(newg);
t[3 * j] = static_cast<uchar>(newb);
}
}
return temp;
}
main.cpp
#include <iostream>
#include <opencv2/highgui.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/opencv.hpp>
#include "function.h"
using namespace cv;
using namespace std;
int main()
{
Mat scr = imread("F:\\picture\\橘子洲.jpg");
Mat res = Contrast(scr, 75.f);
imshow("原图", scr);
imshow("处理后", res);
waitKey(0);
return 0;
}
结果
以上就是对比度的所有内容了,感谢观看,如果喜欢,不妨点赞关注!