• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C++OpencvcreateTrackbar()创建滑动条实现对比度、亮度调节及注意事项 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1.1对比度

对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,差异范围越大代表对比越大,差异范围越小代表对比越小。对比度对视觉效果的影响非常关键,一般来说对比度越大,图像越清晰醒目,色彩也越鲜明艳丽;而对比度小,则会让整个画面都灰蒙蒙的。高对比度对于图像的清晰度、细节表现、灰度层次表现都有很大帮助。相对而言,对比度对灰度图的影响要比彩图大。

提高图像对比度的方法:让白色区域更亮,黑色区域更暗。

1.2亮度

亮度是一个相对概念,取决于视觉感受。对数字图像而言,提高/降低亮度的方法就是增加/减小像素对应通道的灰度值。

1.3代码中用到的调节公式

                                                                                 g(i,j) = a * f(i,j) + b

f(i,j)是原图像,g(i,j)是调节后的图像,a是对比度拉伸系数,b是对亮度的偏置值。

二、代码

2.1代码如下

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

using namespace std;
using namespace cv;

int iContrastValue = 100;
int iBrightValue = 0;

Mat srcImage;
Mat dstImage;

//Change the pixel values
void ChangePixelValue(Mat inputImage, Mat outputImage)
{
	for (int i = 0; i < inputImage.rows; i++)
		for (int j = 0; j < inputImage.cols; j++)
			for (int k = 0; k < inputImage.channels(); k++)
				outputImage.at<Vec3b>(i, j)[k] = saturate_cast<uchar>(inputImage.at<Vec3b>(i, j)[k] * iContrastValue / 100 + iBrightValue);
	imshow("The modified image", dstImage);
}

//Change the contrast value
void ChangeContrastValue(int, void*)
{
	ChangePixelValue(srcImage, dstImage);
}

//Change the bright value
void ChangeBrightValue(int, void*)
{
	ChangePixelValue(srcImage, dstImage);
}

int main()
{
	srcImage = imread("toothless.jpg", 1);
	dstImage = Mat::zeros(srcImage.size(), srcImage.type());
	if (srcImage.data == 0)
	{
		cerr << "Image reading error !" << endl;
		return -1;
	}
	namedWindow("The original image", WINDOW_NORMAL);
	imshow("The original image", srcImage);

	//Create two trackbars
	namedWindow("The modified image", WINDOW_NORMAL);
	createTrackbar("The contrast value", "The modified image", &iContrastValue, 300, ChangeContrastValue, 0);
	ChangeContrastValue(iContrastValue, 0);
	createTrackbar("The bright value", "The modified image", &iBrightValue, 20, ChangeBrightValue, 0);
	ChangeBrightValue(iBrightValue, 0);
	waitKey();
	return 0;
}

 

2.2代码经验

2.2.1createTrackbar()函数的使用

参见https://blog.csdn.net/mysee1989/article/details/41379817,较为详细。

2.2.2saturate_cast<>()防溢出函数的使用

一般情况下图像灰度值的范围都在0--255之间(CV_8U),但本程序涉及到乘法、加法等线性运算,数值很容易超出255,造成数据溢出。可用saturate_cast<>()防溢出函数将超出的值拉回范围内。拉回超范围值的原则遵循:超过上限的元素统一赋值为上限值,低于下限的元素统一赋值为下限值。

uchar a = saturate_cast<uchar>(-100); // 低于下限赋值为uchar_min:a = 0 
short b = saturate_cast<short>(33333.33333); //高于上限赋值为short_max: b = 32767 

2.2.3imshow()函数的放置

程序最后用imshow()函数对调节后的图像进行显示时,一定要将imshow()函数放进滑动条的回调函数内部,否则改变滑动条参数后,虽然图像矩阵的数值也会发生改变,但imshow()并不会载入新的图像矩阵并刷新显示。

 

注:错误之处,敬请雅正!


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
c#中对txt文件的读取与写入,针对二维数组发布时间:2022-07-13
下一篇:
C++Opencv傅里叶变换的代码实现及关键函数详解发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap