资讯专栏INFORMATION COLUMN

OpenCV-图像对比度

soasme / 741人阅读

摘要:针对图像所有像素点单个处理。至此,图像实现了明度的调整,算法逻辑参考。功能函数代码对比度测试代码对比度测试效果图原图图参数为的效果图图参数为的效果图通过调整可以实现图像对比度的调整。

作者:Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

实现原理

       图像对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,即指一幅图像灰度反差的大小。差异范围越大代表对比越大,差异范围越小代表对比越小。设置一个基准值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。

       至此,图像实现了明度的调整,算法逻辑参考xingyanxiao。C++实现代码如下。

功能函数代码

// 对比度cv::Mat Contrast(cv::Mat src, int percent){	float alpha = percent / 100.f;	alpha = max(-1.f, min(1.f, alpha));	cv::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(i);		uchar *s = src.ptr(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(thresh + (r - thresh) / (1 - alpha));				newg = static_cast(thresh + (g - thresh) / (1 - alpha));				newb = static_cast(thresh + (b - thresh) / (1 - alpha));			}			else {				newr = static_cast(thresh + (r - thresh) * (1 + alpha));				newg = static_cast(thresh + (g - thresh) * (1 + alpha));				newb = static_cast(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(newr);			t[3 * j + 1] = static_cast(newg);			t[3 * j] = static_cast(newb);		}	}	return temp;}

C++测试代码

#include #include using namespace cv;using namespace std;cv::Mat Contrast(cv::Mat src, int percent);int main(){	cv::Mat src = imread("5.jpg");	cv::Mat result = Contrast(src, 50.f);	imshow("original", src);	imshow("result", result);	waitKey(0);	return 0;}// 对比度cv::Mat Contrast(cv::Mat src, int percent){	float alpha = percent / 100.f;	alpha = max(-1.f, min(1.f, alpha));	cv::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(i);		uchar *s = src.ptr(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(thresh + (r - thresh) / (1 - alpha));				newg = static_cast(thresh + (g - thresh) / (1 - alpha));				newb = static_cast(thresh + (b - thresh) / (1 - alpha));			}			else {				newr = static_cast(thresh + (r - thresh) * (1 + alpha));				newg = static_cast(thresh + (g - thresh) * (1 + alpha));				newb = static_cast(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(newr);			t[3 * j + 1] = static_cast(newg);			t[3 * j] = static_cast(newb);		}	}	return temp;}

测试效果

图1 原图
图2 参数为50的效果图
图3 参数为-50的效果图

       通过调整percent可以实现图像对比度的调整。

       如果函数有什么可以改进完善的地方,非常欢迎大家指出,一同进步何乐而不为呢~

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/119266.html

相关文章

  • 数字图像处理:OpenCV-Python中的直方图均衡知识介绍及函数equalizeHist详解

    摘要:对于图像整体比较暗的情况,直方图均衡能得到类似的效果。这些内容老猿在数字图像处理直方图均衡算法研究及模拟实现中进行介绍,本部分主要详细介绍提供的直方图均衡函数。更多图像直方图处理的内容请参考数字图像处理第三章学习总结感悟直方图处理的介绍。 ...

    ityouknow 评论0 收藏0
  • OpenCV 完整例程】39. 图像灰度的线性变换

    摘要:完整例程图像灰度的线性变换欢迎关注完整例程篇系列,持续更新中欢迎关注小白的学习课系列,持续更新中线性灰度变换将原始图像灰度值的动态范围按线性关系扩展到指定范围或整个动态范围。 ...

    Meils 评论0 收藏0
  • 女朋友嫌我拍的照片有雾,连夜用OpenCV写出❤️去雾算法❤️逃过一劫(收藏保命)

    ❤️欢迎订阅《从实战学python》专栏,用python实现爬虫、办公自动化、数据可视化、人工智能等各个方向的实战案例,有趣又有用!❤️ 更多精品专栏简介点这里 治愈生活的良方 就是保持对生活的热爱 前言 哈喽,大家好,我是一条。 每次和女朋友出去玩,拍照是必须的,天气好还行,天气要是不好,加上我这破手机,那拍的简直惨不忍睹,自己都不过去。 但是没什么能难倒程序员的,为了不挨骂,连夜写出去雾...

    DTeam 评论0 收藏0
  • OpenCV实用:C++实现低比度图像脏污区域检测

    摘要:第二种方法是本人根据提高图像对比度思路实现的,具体步骤如下对图像进行高斯模糊去噪使用局部直方图均衡化方法来提高图像对比度使用二值化阈值方法来粗略分割脏污区域对二值图像使用腐蚀的形态学操作过滤掉部分非脏污区域调用方法查找脏污区域轮廓。 ...

    chenjiang3 评论0 收藏0
  • 数字图像处理:使用直方图统计进行图像增强

    摘要:如果将二者的处理的一些数据结合起来使用,则就是基于直方图统计进行图像增强。图中是通过直方图统计进行图像增强后的结果,可以看到另一个钨丝的比较明显的结构。 一、引...

    coolpail 评论0 收藏0
  • opencv python 直方图均衡化

    摘要:如果噪音在那里,它就会被放大为了避免这种情况,会应用对比限制如果任何直方图超出指定的对比度限制默认情况下是,在应用直方图均衡之前,这些像素被裁剪并均匀地分布到其他均衡后,删除边界中的工件,采用双线性插值代码 Histograms - 2: Histogram Equalization 直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法.通过这种方法,亮度可以更好地在直方...

    Airmusic 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<