1.介绍
图像柔光效果在很多商业软件中都有实现,其能针对原始图像产生一副新的比较平滑感觉光线比较柔和的效果,给人一种朦胧美。具体的实现分为以下三步:
第一步:对原始图像按指定的半径进行高斯模糊;
第二步:对模糊后的图像继续进行亮度和对比度的调整;
第三步:按照公式dst = X + Y - X * Y / 255进行处理,其中X代表原始图像,Y代表第二步所得到的图片
2.代码
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
double alpha = 1;
double beta = 50;
void softGlowTrans(const Mat& src, Mat& dst) {
GaussianBlur(src, dst, cv::Size(11, 11), 3, 3);
dst.convertTo(dst, dst.type(), alpha, beta);
int width = src.cols;
int high = src.rows;
for (int h = 0; h < high; ++h) {
for (int w = 0; w < width; ++w) {
dst.at<Vec3b>(h, w)[0] = src.at<Vec3b>(h, w)[0] + dst.at<Vec3b>(h, w)[0] - src.at<Vec3b>(h, w)[0] * dst.at<Vec3b>(h, w)[0] / 255;
dst.at<Vec3b>(h, w)[1] = src.at<Vec3b>(h, w)[1] + dst.at<Vec3b>(h, w)[1] - src.at<Vec3b>(h, w)[1] * dst.at<Vec3b>(h, w)[1] / 255;
dst.at<Vec3b>(h, w)[2] = src.at<Vec3b>(h, w)[2] + dst.at<Vec3b>(h, w)[2] - src.at<Vec3b>(h, w)[2] * dst.at<Vec3b>(h, w)[2] / 255;
}
}
}
int main() {
Mat src = imread("test.png");
Mat dst = Mat::zeros(src.size(), src.type());
softGlowTrans(src, dst);
imshow("src", src);
imshow("dst", dst);
waitKey();
return 0;
}
效果图: