人脸美容效果2-边缘处理
1.快速边缘保留算法
先看两张图:
具体代码
// 1. 快速边缘保留
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
// 1. 快速边缘保留
int getBlockSum(Mat &sum_mat,int x0,int y0,int x1,int y1,int ch){
// 获取四个点的值(因为肯定会超过 255 所以需要用Vec3i 来装)
int lt = sum_mat.at<Vec3i>(y0, x0)[ch];
int lb = sum_mat.at<Vec3i>(y1, x0)[ch];
int rt = sum_mat.at<Vec3i>(y0, x1)[ch];
int rb = sum_mat.at<Vec3i>(y1, x1)[ch];
// 区块的合
int sum = rb - lb - rt + lt;
return sum;
}
float getBlockSqSum(Mat &sqsum_mat, int x0, int y0, int x1, int y1, int ch){
// 获取四个点的值(因为肯定会超过 255 所以需要用Vec3f 来装)
float lt = sqsum_mat.at<Vec3f>(y0, x0)[ch];
float lb = sqsum_mat.at<Vec3f>(y1, x0)[ch];
float rt = sqsum_mat.at<Vec3f>(y0, x1)[ch];
float rb = sqsum_mat.at<Vec3f>(y1, x1)[ch];
// 区块的合
float sqsum = rb - lb - rt