结果展示
高频
猫
低频
人物
结果
过程
1、读入图片
img_cat = imread("/home/joshua/Projects/C++/CV/test/cat.jpg");
img_human = imread("/home/joshua/Projects/C++/CV/test/human.jpg");
2、resize
resize(img_human, img_human, Size(img_cat.cols, img_cat.rows));
3、gaussion 滤波
GaussianBlur(img_cat, img_cat_gaus, Size(kernel1, kernel1), sigmaX, sigmaY);
GaussianBlur(img_human, img_human_gaus, Size(kernel2, kernel2), sigmaX, sigmaY);
4、分解高频和低频
cat做高频
human做低频
res1 = img_cat - img_cat_gaus;
imshow("高频", res1);
imshow("低频", img_human_gaus);
5、hybridimg
alpha = (double) alpha_slider / alpha_slider_max;
beta = (1.0 - alpha);
addWeighted(res1, alpha, img_human_gaus, beta, 0.0, res);
结果分析
低频中kernel越大图片越模糊
高频中kernel越大图片细节越多
代码
#include <iostream>
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/videoio.hpp"
using namespace cv;
using namespace std;
const int kernel_size_max = 30;
const int alpha_slider_max = 100;
const int sigma_slider_max = 100;
int alpha_slider, sigmaX_slider, sigmaY_slider;
int kernel1, kernel2;
double alpha;
double beta;
double sigmaX = 0, sigmaY = 0;
Mat img_cat, img_human, img_cat_gaus, img_human_gaus;
Mat res1, res;
static void on_trackbar(int, void *) {
if (kernel1 % 2 == 0) kernel1++;
if (kernel2 % 2 == 0) kernel2++;
sigmaX = (double) sigmaX_slider / sigma_slider_max;
sigmaY = (double) sigmaY_slider / sigma_slider_max;
GaussianBlur(img_cat, img_cat_gaus, Size(kernel1, kernel1), sigmaX, sigmaY);
GaussianBlur(img_human, img_human_gaus, Size(kernel2, kernel2), sigmaX, sigmaY);
res1 = img_cat - img_cat_gaus;
imshow("高频", res1);
imshow("低频", img_human_gaus);
alpha = (double) alpha_slider / alpha_slider_max;
beta = (1.0 - alpha);
addWeighted(res1, alpha, img_human_gaus, beta, 0.0, res);
imshow("res", res);
}
int main() {
img_cat = imread("/home/joshua/Projects/C++/CV/test/cat.jpg");
img_human = imread("/home/joshua/Projects/C++/CV/test/human.jpg");
resize(img_human, img_human, Size(img_cat.cols, img_cat.rows));
alpha_slider = 0;
kernel1 = 1;
kernel2 = 1;
namedWindow("res", WINDOW_AUTOSIZE); // Create Window
char alphaTrackbar[50], kernel1SizeTrackbar[50], kernel2SizeTrackbar[50], sigmaXTrackbar[50], sigmaYTrackbar[50];
sprintf(alphaTrackbar, "Alpha: %d %", alpha_slider_max);
sprintf(kernel1SizeTrackbar, "kernel1 size: %d", kernel_size_max);
sprintf(kernel2SizeTrackbar, "kernel2 size: %d", kernel_size_max);
sprintf(sigmaXTrackbar, "sigmaX: %d ", sigma_slider_max);
sprintf(sigmaYTrackbar, "sigmaY: %d", sigma_slider_max);
createTrackbar(alphaTrackbar, "res", &alpha_slider, alpha_slider_max, on_trackbar);
createTrackbar(kernel1SizeTrackbar, "res", &kernel1, kernel_size_max, on_trackbar);
createTrackbar(kernel2SizeTrackbar, "res", &kernel2, kernel_size_max, on_trackbar);
createTrackbar(sigmaXTrackbar, "res", &sigmaX_slider, sigma_slider_max, on_trackbar);
createTrackbar(sigmaYTrackbar, "res", &sigmaY_slider,sigma_slider_max, on_trackbar);
on_trackbar(alpha_slider, 0);
on_trackbar(kernel1, 0);
on_trackbar(kernel2, 0);
on_trackbar(sigmaX_slider, 0);
on_trackbar(sigmaY_slider, 0);
waitKey(0);
return 0;
}