前言:
现时同学们对“opencv磨皮算法”大体比较看重,同学们都需要了解一些“opencv磨皮算法”的相关文章。那么小编同时在网络上汇集了一些关于“opencv磨皮算法””的相关知识,希望姐妹们能喜欢,看官们一起来了解一下吧!总结了一下滤波,意外发现滤波修图效果竟然如此之好,忍不住分享一下,各位大佬点个赞鼓励一下可好。
虽然我喜欢用MATLAB,但是不得不承认,今天真没MATLAB什么事。这几个滤波方式MATLAB上没找到。
美颜效果较好的四种滤波方式都属于边缘滤波保留,分别是:均值迁移滤波,快速图像边缘滤波,非局部均值滤波,高斯双边滤波,后面两种滤波前面有提到,因此主要介绍一下前两种滤波方法。
均值迁移滤波
主要原理是在对图像进行滤波的时候,考虑图像像素的空间范围分布,只有符合条件的像素才参与计算,计算像素的均值与空间位置的均值,使用新的均值空间位置作为窗口中心位置继续计算像素均值与空间位置均值,就这样迁移下去,直到像素空间位置不再变化为止。
OpenCV调用api: pyrMeanShiftFiltering(src, dst, sp, sr, level, termcrit, criteria)
滤波后的图像如图:
快速图像边缘滤波
快速边缘滤波原理和高斯双边滤波差不多,但是高斯双边滤波采用五维向量进行计算,导致速度慢,而快速边缘滤波则通过等价变换到低维度空间,实现数据降维与快速计算。
OpenCV调用api: edgePreservingFilter(src, dst, flags, sigma_s, sigma_r);其中 sigma_s 越大,图像滤波效果越好; sigma_r 越大,图像越模糊。
c++滤波
其实滤波就是一句话就搞定,代码很简单,效果也不错,用来磨皮消痘痘什么的都很棒。
#include <opencv2/opencv.hpp>#include <iostream>using namespace cv;using namespace std;int main(int argc, char** argv) { Mat img = imread("data/images/face1.jpg");/* int h = img.rows; // 图像尺寸太大了缩小一半 int w = img.cols; resize(img, img, Size(0.5*w, 0.5*h), INTER_CUBIC);*/ gaussian_noise(img); imshow("原图像", img); Mat dst1, dst2, dst3, dst4; pyrMeanShiftFiltering(img, dst1, 5, 15, 1, TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 5, 1)); imshow("均值迁移滤波", dst1); // 均值迁移滤波 edgePreservingFilter(img, dst2, 1, 80, 0.25); // 快速图像边缘滤波 imshow("快速图像边缘滤波", dst2); fastNlMeansDenoisingColored(img, dst3, 5, 5, 5, 15); // 非局部均值滤波 imshow("非局部均值滤波", dst3); bilateralFilter(img, dst4, 0, 50, 10, 4); // 高斯双边滤波 imshow("双边滤波", dst4); waitKey(0); return 0;}
python滤波
python不愧是最简单的语言,基本也是一句话搞定。效果和前面的图一样。
import cv2 as cvimg = cv.imread("data/images/face1.jpg")cv.imshow("image", img)# 均值迁越滤波dst1 = cv.pyrMeanShiftFiltering(img, 5, 10, termcrit=(cv.TERM_CRITERIA_MAX_ITER+cv.TERM_CRITERIA_EPS, 5, 1))cv.imshow("pyrMeanShiftFiltering", dst1)# 快速图像边缘滤波dst2 = cv.edgePreservingFilter(img, sigma_s=80, sigma_r=0.25, flags=cv.RECURS_FILTER)cv.imshow("edgePreservingFilter", dst2) # 非局部均值滤波dst3 = cv.fastNlMeansDenoisingColored(img, None, 5, 5, 5, 15) cv.imshow("fastNlMeansDenoisingColored", dst3) # 高斯双边滤波dst4 = cv.bilateralFilter(img, 0, 50, 10) cv.imshow("bilateralFilter", dst4)cv.waitKey(0)cv.destroyAllWindows()
总结,滤波可以去除图像的杂质和噪声,使图像平滑,是图像处理中比较重要的一环。而且通过自己设定参数,可以达到不错的美颜效果哦。
周末也在发头条,风某人从来不需要假期。
标签: #opencv磨皮算法