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;
}
效果圖: