照片美化
2016-08-02 11:24
736 查看
#include<opencv2\opencv.hpp> using namespace cv; using namespace std; Mat meibai(Mat &img); Mat wImg(Mat &img1, Mat &img2); void lbImg(Mat &img1, Mat &img2, Mat &result, int rad, int e); void dealImg(Mat &img); int main() { Mat img = imread("E://图片//色斑.jpg"); if (img.empty()) { return -1; } imshow("img_org", img); dealImg(img); waitKey(0); destroyAllWindows; return 0; } void dealImg(Mat &img) { Mat tem = img.clone(); Mat result = img.clone(); Mat gray; cvtColor(img, gray, CV_BGR2GRAY); vector<Mat> channelsone, channelstwo; split(tem, channelsone); split(result, channelstwo); for (int i = 0; i < 3; i++) { lbImg(channelsone[i], gray, channelstwo[i], 18, 500); } merge(channelstwo, result); result = wImg(result, img); imshow("result", result); } void lbImg(Mat &img1, Mat &img2, Mat &result, int rad, int e) { img1.convertTo(img1, CV_32F); img2.convertTo(img2, CV_32F); result.convertTo(result, CV_32F); Mat tem_img1, tem_img2; multiply(img1, img2, tem_img1); multiply(img2, img2, tem_img2); //求方差用 Size dealSize(rad, rad); Mat box1, box2, box3, box4; boxFilter(tem_img1, box1, CV_32F, dealSize); //两图像的均值乘积 boxFilter(tem_img2, box2, CV_32F, dealSize); //平方的均值 boxFilter(img1, box3, CV_32F, dealSize); //图片1的均值 boxFilter(img2, box4, CV_32F, dealSize); //图片2的均值 Mat one, two, a, b; one = box1 - box4.mul(box3); //分子 two = box2 - box4.mul(box4) + e; divide(one, two, a); //得到系数 b = box3 - a.mul(box4); //得到常数 Mat box_r1, box_r2; boxFilter(a, box_r1, CV_32F, dealSize); boxFilter(b, box_r2, CV_32F, dealSize); result = box_r1.mul(img2) + box_r2; result.convertTo(result, CV_8U); } Mat wImg(Mat &img1, Mat &img2) { Mat y = img1.clone(); int alpha = 30; //img1 = (y*(100 - alpha) + (y + 2 * img1 - 256)*alpha) / 100; //与原图混合 for (int i = 0; i < img1.rows; i++) { //羽化融合,也可锐化操作增加纹理 uchar * p1 = img1.ptr<uchar>(i); uchar * p2 = img2.ptr<uchar>(i); for (int j = 0; j < img1.cols; j++) { p1[j * 3 + 0] = (p2[j * 3 + 0] * alpha + (255 - alpha) * p1[j * 3 + 0]) >> 8; p1[j * 3 + 1] = (p2[j * 3 + 1] * alpha + (255 - alpha) * p1[j * 3 + 1]) >> 8; p1[j * 3 + 2] = (p2[j * 3 + 2] * alpha + (255 - alpha) * p1[j * 3 + 2]) >> 8; } } img1 = meibai(img1); //美白 return img1; } Mat meibai(Mat &img) { Mat tem = img.clone(); tem.convertTo(tem, CV_32F, 1/255.0); Mat result(tem.size(), tem.type()); float beta = 4.0; for (int i = 0; i < img.rows; i++) { float *p1 = tem.ptr<float>(i); float *p2 = result.ptr<float>(i); for (int j = 0; j < img.cols; j++) { float Bt = log(p1[j * 3 + 0] * (beta - 1) + 1); float Gt = log(p1[j * 3 + 1] * (beta - 1) + 1); float Rt = log(p1[j * 3 + 2] * (beta - 1) + 1); p2[j * 3 + 0] = Bt / log(beta); p2[j * 3 + 1] = Gt / log(beta); p2[j * 3 + 2] = Rt / log(beta); } } result.convertTo(result, CV_8U, 255); return result; }
效果:
笔记:
相关文章推荐
- python中使用OpenCV进行人脸检测的例子
- opencv 做人脸识别 opencv 人脸匹配分析
- 使用opencv拉伸图像扩大分辨率示例
- Android Studio中配置OpenCV库开发环境的教程
- 基于C++实现kinect+opencv 获取深度及彩色数据
- visual studio 2012安装配置方法图文教程 附opencv配置教程
- OpenCV 2.4.3 C++ 平滑处理分析
- Python中使用OpenCV库来进行简单的气象学遥感影像计算
- 利用Python和OpenCV库将URL转换为OpenCV格式的方法
- python结合opencv实现人脸检测与跟踪
- Python环境搭建之OpenCV的步骤方法
- Python+Opencv识别两张相似图片
- Python实现OpenCV的安装与使用示例
- 在树莓派2或树莓派B+上安装Python和OpenCV的教程
- opencv-python学习一--人脸检测
- 在Ubuntu上安装OpenCV3.0和Python-openCV的经历
- 使用 Java 开发 OpenCV 应用
- OpenCV配置,从来没有这么简单!
- ubuntu下opencv和qt的安装配置
- visual studio 2012安装配置方法图文教程 附opencv配置教程