Opencv之图像柔光效果

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;
}

    效果图:

 

3.参考资料

    https://www.cnblogs.com/Imageshop/p/3145216.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章