资讯专栏INFORMATION COLUMN

OpenCV-图像明度

leone / 765人阅读

摘要:计算明度的基准是灰度测试卡。针对图像所有像素点单个处理。当大于等于时,加上白色遮罩,调整后的三通道数值为若小于时,加上黑色遮罩,此时调整后的图像三通道值为至此,图像实现了明度的调整,算法逻辑参考。

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

实现原理

       颜色所具有的亮度和暗度被称为图像明度。计算明度的基准是灰度测试卡。黑色为0,白色为10。色彩可以分为有彩色和无彩色,但后者仍然存在着明度。作为有彩色,每种色各自的亮度、暗度在灰度测试卡上都具有相应的位置值。彩度高的色对明度有很大的影响,不太容易辨别。在明亮的地方鉴别色的明度比较容易的,在暗的地方就难以鉴别。

       明度调整可通过合成方式实现:若参数为正,则调整后的图像可以认为加了一层白色遮罩层,即原图像RGB数值×(1-alpha)+255*alpha;反之亦然,认为加了一层黑色遮罩层,即原图RGB*(1+alpha),其中alpha是负数。

       明度调整算法的具体实现流程如下:

       1.设置调整参数percent,取值为-100到100,类似PS中设置,归一化后为-1到1。

       2.针对图像所有像素点单个处理。当percent大于等于0时,加上白色遮罩,调整后的RGB三通道数值为:

       3.若percent小于0时,加上黑色遮罩,此时调整后的图像RGB三通道值为:

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

功能函数代码

// 明度cv::Mat Lightness(cv::Mat src, float percent){	float alpha = percent / 100;	alpha = max(-1.f, min(1.f, alpha));	cv::Mat temp = src.clone();	int row = src.rows;	int col = src.cols;	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];			if (alpha >= 0)			{				t[3 * j + 2] = static_cast(r*(1 - alpha) + 255 * alpha);				t[3 * j + 1] = static_cast(g*(1 - alpha) + 255 * alpha);				t[3 * j] = static_cast(b*(1 - alpha) + 255 * alpha);			}			else			{				t[3 * j + 2] = static_cast(r*(1 + alpha));				t[3 * j + 1] = static_cast(g*(1 + alpha));				t[3 * j] = static_cast(b*(1 + alpha));			}		}	}	return temp;}

C++测试代码

#include #include using namespace cv;using namespace std;cv::Mat Lightness(cv::Mat src, float percent);int main(){	cv::Mat src = imread("1.jpg");	cv::Mat result = Lightness(src, 50.f);	imshow("original", src);	imshow("result", result);	waitKey(0);	return 0;}// 明度cv::Mat Lightness(cv::Mat src, float percent){	float alpha = percent / 100;	alpha = max(-1.f, min(1.f, alpha));	cv::Mat temp = src.clone();	int row = src.rows;	int col = src.cols;	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];			if (alpha >= 0)			{				t[3 * j + 2] = static_cast(r*(1 - alpha) + 255 * alpha);				t[3 * j + 1] = static_cast(g*(1 - alpha) + 255 * alpha);				t[3 * j] = static_cast(b*(1 - alpha) + 255 * alpha);			}			else			{				t[3 * j + 2] = static_cast(r*(1 + alpha));				t[3 * j + 1] = static_cast(g*(1 + alpha));				t[3 * j] = static_cast(b*(1 + alpha));			}		}	}	return temp;}

测试效果

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

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

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

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

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

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

相关文章

  • 基于HSV颜色空间用OpenCV-Python给照片换底

    摘要:本文就介绍结合老猿的思路和总裁余的思路来介绍基于空间来实现照片颜色换底。老猿,跟老猿学前往老猿博文目录 ☞ ░ 前往老猿Python博文目录 https://b...

    toddmark 评论0 收藏0
  • 【评论区送书】使用 Python 和 OpenCV图像进行加水印

    摘要:水印有意在图像上留下文本标志,很多博主会使用水印来保护图像的版权。使用水印我们可以确保图像的所有者是在图像上印制水印的人。全书分为篇,共章。理论和实践相结合。 ? ...

    doodlewind 评论0 收藏0
  • 颜色识别、轮廓识别-树莓派 Opencv-基于Python学习记录DAY-4

    摘要:它们的补色是黄色为,青色为紫色为饱和度饱和度表示颜色接近光谱色的程度。光谱色的白光成分为,饱和度达到最高。转换图像格式得到滑动条的数值参数第一个参数是滑动条名字,第二个时所在窗口,返回值是滑动条的数值。 学习颜色识别之前先介绍一下新认识的图像格式HSV: 色调H 用角度度量,取值范围为0°~...

    BlackFlagBin 评论0 收藏0
  • opencv python 读取图像/显示图像/保存图像

    摘要:以毫秒为单位延迟。默认为代码应用加载一幅灰度图像,显示它,如果按则保存图像并退出,如果按键直接退出。使用使用显示图像。 以前也用过opencv, 不过都是按需使用, 掌握的知识很零散, 这次希望能够系统学习opencv-python 本文直接从Gui Features开始. 1 读取图片 使用cv2.imread()函数读取图像. cv2.imread(filename[, flags...

    jay_tian 评论0 收藏0
  • OpenCV 完整例程】21. 图像的叠加

    摘要:实现图像的叠加,需要综合运用图像阈值处理图像掩模位操作和图像加法的操作。使用位操作生成前景背景图像时,遮罩区域以外与进行自与操作,如果用自或操作参见程序注释语句的效果也是相同的。该方法通过固定阈值处理图像,将像素点的灰度值设为或。 ...

    whinc 评论0 收藏0

发表评论

0条评论

leone

|高级讲师

TA的文章

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