opencv上Gamma调节的源码
【摘要】
这周单位要做一个人脸美化的项目,查资料遇到这位大牛的博客,地址如下:点击打开链接
我的代码也是在他的基础上进行修改的,但是他对图像的RGB三个通道平等调节,为了适应我的需求,我改成了针对三个通道分别调节。废话不多说,开始上源码
void ImageAdjust(Mat& src, Mat& dst, ve...
这周单位要做一个人脸美化的项目,查资料遇到这位大牛的博客,地址如下:点击打开链接
我的代码也是在他的基础上进行修改的,但是他对图像的RGB三个通道平等调节,为了适应我的需求,我改成了针对三个通道分别调节。废话不多说,开始上源码
-
void ImageAdjust(Mat& src, Mat& dst,
-
vector<double> low_in,
-
vector<double> high_in,
-
vector<double> low_out,
-
vector<double> high_out,
-
vector<double> gamma)
-
{
-
vector<double> low;
-
vector<double> high;
-
vector<double> bottom;
-
vector<double> top;
-
vector<double> err_in;
-
vector<double> err_out;
-
int N = low_in.size();
-
-
for (int i=0; i<N; i++)
-
{
-
low.push_back(low_in[i]*255);
-
high.push_back(high_in[i]*255);
-
bottom.push_back(low_out[i]*255);
-
top.push_back(high_out[i]*255);
-
err_in.push_back(high[i] - low[i]);
-
err_out.push_back(top[i] - bottom[i]);
-
}
-
-
int x,y;
-
vector<double> val;
-
-
// intensity transform
-
for( y = 0; y < src.rows; y++)
-
{
-
for (x = 0; x < src.cols; x++)
-
{
-
for (int i=0; i<N; i++)
-
{
-
double val = (src.at<Vec3b>(y, x)[i]);
-
val = pow((val-low[i])/err_in[i], gamma[i])*err_out[i]+bottom[i]; // ☆
-
-
if(val > 255)
-
val = 255;
-
if(val < 0)
-
val = 0;
-
dst.at<Vec3b>(y, x)[i] = val;
-
}
-
}
-
}
-
-
}
测试主函数:
-
int _tmain(int argc, _TCHAR* argv[])
-
{
-
Mat src = imread("test.png",1);
-
Mat dst = Mat(src.size(), src.type());
-
-
if (!src.empty())
-
{
-
double a[] = {0.0, 0.0, 0.0};
-
double b[] = {1.0, 1.0, 1.0};
-
double c[] = {0.0, 0.0, 0.0};
-
double d[] = {1.0, 1.0, 1.0};
-
double e[] = {1.0, 1.0, 1.0};
-
-
vector<double> low_in(a, a+3);
-
vector<double> high_in(b, b+3);
-
vector<double> low_out(c, c+3);
-
vector<double> high_out(d, d+3);
-
vector<double> gamma(e, e+3);
-
-
ImageAdjust(src, dst,
-
low_in,
-
high_in,
-
low_out,
-
high_out,
-
gamma
-
);
-
-
imshow("src", src);
-
imshow("dst", dst);
-
waitKey(0);
-
}
-
-
-
return 0;
-
}
注意:☆处是将图像I中的亮度值映射为一个新值,即将low_in至high_in之间的值映射到low_out至high_out之间的值。low_in 以下与 high_in 以上的值被截断了,其中 gamma指定描述值I和值J关系曲线的形状。如果gamma小于1,此映射偏重更高数值(明亮)输出,如果gamma大于1,此映射偏重更低数值(灰暗)输出,如果省略此参数,默认为(线性映射)。 具体用法可以参考matlab中的imadjust。
文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。
原文链接:panda1234lee.blog.csdn.net/article/details/26726241
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)