目录

1 保边滤波的频域变换

1.1 保边滤波器Edge Preserving Filter

1.1.1 函数调用

1.1.2 edgePreservingFilter结果

1.2 细节增强

1.3 素描滤波器

1.4 风格化滤波器

2 代码

3 参考


有人认为使用高斯内核简单地模糊图像,检测边缘,并将两个图像组合以获得上面所示卡通化图像。虽然在大多数区域中所有图像看起来都很平滑之后,边缘会被保留。结果看起来很荒谬;

这是一个糟糕的主意。通过双边滤波可以完成这项工作,双边滤波可能是计算机视觉中最常用的边缘平滑滤波器,但它很慢。你永远不会在实时应用程序中使用它。我很高兴看到在OpenCV 3中非常快速地实现了保边滤波器。结果与双边滤波非常相似,但速度更快。这是SIGGRAPH 2011论文Domain transform for edge-aware image and video processing实现。论文作者为Eduardo Gastal and Manuel Oliveira。论文见:

http://www.inf.ufrgs.br/~eslgastal/DomainTransform/Gastal_Oliveira_SIGGRAPH2011_Domain_Transform.pdf

保边滤波器详细见:

https://blog.csdn.net/eejieyang/article/details/52333112

1 保边滤波的频域变换

作者Eduardo Gastal在他的项目页面上提供了很多材料来解释论文及其应用。详细链接见:

http://www.inf.ufrgs.br/~eslgastal/DomainTransform/

在OpenCV 3中,本文使用Photo模块下的Computational

Photography子模块中的四个函数实现。以下部分通过示例解释这些功能及其参数。在所有示例中,我们将使用下面的图像作为输入图像。

1.1 保边滤波器Edge Preserving Filter

1.1.1 函数调用

OpenCV中保边滤波器调用函数为edgePreservingFilter。

函数具体调用如下:

C++:

edgePreservingFilter(Mat src, Mat dst, int flags=1, float sigma_s=60, float sigma_r=0.4f)

Python:

dst = cv2.edgePreservingFilter(src, flags=1, sigma_s=60, sigma_r=0.4)

函数具体参数如下:

SRC:8位3通道输入图像

DST:8位3通道输出图像

Flag:保变滤波器类型。取值RECURS_FILTER(递归滤波)= 1和NORMCONV_FILTER(归一化卷积)=2。使用RECURS_FILTER选项比NORMCONV_FILTER快约3.5倍。但NORMCONV_FILTER产生边缘锐化。当不希望锐化时,要求速度应该使用RECURS_FILTER。

sigma_s:范围在0到200之间(详见下文)

sigma_r:范围在0到1之间(详见下文)

参数sigma_s和sigma_r是什么意思?

图像处理和计算机视觉中的大多数平滑滤波器(例如高斯滤波器或盒式滤波器)具有称为sigma_s(用于Sigma_Spatial)的参数,其确定平滑量。典型的平滑滤波器通过其邻居的加权和来替换像素的值。邻域越大,过滤后的图像越平滑。邻域的大小与参数sigma_s成正比。

在保边滤波器中,有两个相互竞争的目标:a)平滑图像b)不平滑边缘/颜色边界。换句话说,我们不能简单地用它的邻居的加权和来代替像素的颜色。相反,我们想要将像素中的颜色值替换为邻域中的像素的平均值,使其也具有与像素类似的颜色。所以我们有两个参数:sigma_s和sigma_r。就像其他平滑滤波器一样,sigma_s控制邻域的大小,sigma_r(用于sigma_range)控制邻域内的不同颜色的平均值。较大的sigma_r导致大面积的恒定颜色区域。

1.1.2 edgePreservingFilter结果

将edgePreservingFilter与RECURS_FILTER一起应用的结果如下所示:

施加edgePreservingFilter与NORMCONV_FILTER的结果如下所示:

正如您所看到的,两个结果非常接近,因此我建议使用 RECURS_FILTER, 因为它比NORMCONV_FILTER快。

1.2 细节增强

顾名思义,过滤器可以增强细节,使图像更清晰。调用参数如下:

C++:

detailEnhance(Mat src, Mat dst, float sigma_s=10, float sigma_r=0.15f)

Python:

dst = cv2.detailEnhance(src, sigma_s=10, sigma_r=0.15)

参数与保边滤波器调用相同。下图显示了结果细节增强过滤器。请注意,整个图像比输入图像更清晰。

1.3 素描滤波器

此过滤器生成的输出看起来像铅笔草图。有两个输出,一个是将滤镜应用于彩色输入图像的结果,另一个是将其应用于输入图像的灰度版本的结果。坦率地说,我对这个过滤器印象不深,因为结果看起来不太棒。调用如下:

C++:

pencilSketch(Mat src, Mat dst_gray, Mat dst_color, float sigma_s=60, float sigma_r=0.07f, float shade_factor=0.02f)

Python:

dst_gray, dst_color = cv2.pencilSketch(src, sigma_s=60, sigma_r=0.07, shade_factor=0.05)

参数与边缘增强滤镜相同。shade_factor(范围0到0.1)是输出图像强度的简单缩放。值越高,结果越亮。

将pencilSketch滤镜应用于输入图像的结果如下所示。

1.4 风格化滤波器

风格化过滤器产生的输出看起来像使用水彩绘制的图像。调用函数如下:

C++:

stylization(Mat src, Mat dst, float sigma_s=60, float sigma_r=0.45f)

Python:

dst = cv2.stylization(src, sigma_s=60, sigma_r=0.07)

参数与边缘增强滤镜相同。应用于输入图像的结果如下所示。

2 代码

所有代码见:

https://github.com/luohenyueji/OpenCV-Practical-Exercise

C++:

#include "pch.h"
#include <opencv2/opencv.hpp> using namespace cv;
using namespace std; int main()
{
// Read image 读取图像
Mat im = imread("./image/cow.jpg");
Mat imout, imout_gray; // Edge preserving filter with two different flags. 保边滤波器
edgePreservingFilter(im, imout, RECURS_FILTER);
imwrite("edge-preserving-recursive-filter.jpg", imout); edgePreservingFilter(im, imout, NORMCONV_FILTER);
imwrite("edge-preserving-normalized-convolution-filter.jpg", imout); // Detail enhance filter 边缘增强滤波器
detailEnhance(im, imout);
imwrite("detail-enhance.jpg", imout); // Pencil sketch filter 素描滤波器
pencilSketch(im, imout_gray, imout);
imwrite("pencil-sketch.jpg", imout_gray);
imwrite("pencil-sketch-color.jpg", imout_gray); // Stylization filter 风格化滤波器
stylization(im, imout);
imwrite("stylization.jpg", imout); return 0;
}

Python:

import cv2

# Read image
im = cv2.imread("./image/cow.jpg"); # Edge preserving filter with two different flags.
imout = cv2.edgePreservingFilter(im, flags=cv2.RECURS_FILTER);
cv2.imwrite("edge-preserving-recursive-filter.jpg", imout); imout = cv2.edgePreservingFilter(im, flags=cv2.NORMCONV_FILTER);
cv2.imwrite("edge-preserving-normalized-convolution-filter.jpg", imout); # Detail enhance filter
imout = cv2.detailEnhance(im);
cv2.imwrite("detail-enhance.jpg", imout); # Pencil sketch filter
imout_gray, imout = cv2.pencilSketch(im, sigma_s=60, sigma_r=0.07, shade_factor=0.05);
cv2.imwrite("pencil-sketch.jpg", imout_gray);
cv2.imwrite("pencil-sketch-color.jpg", imout); # Stylization filter
cv2.stylization(im,imout);
cv2.imwrite("stylization.jpg", imout);

3 参考

https://www.learnopencv.com/non-photorealistic-rendering-using-opencv-python-c/

最新文章

  1. Windows 10 安装TA-Lib python库
  2. UVA 10474
  3. 使用国内镜像加速下载Android SDK
  4. JAVA对象和XML文档、原来他们之间还有这一出
  5. NCPC 2013: Dance Reconstruction
  6. swfit-pod使用
  7. T-SQL备忘(5):查看执行计划
  8. HTTP编程(六)
  9. [Python]round四舍五入精度缺失的解决
  10. 流程控制 - PHP手册笔记
  11. Windows提供了两种将DLL映像到进程地址空间的方法
  12. Wix打包系列(七) 添加系统必备组件的安装程序
  13. hdu 4407 Sum 容斥+当前离线
  14. OpenCV实时美颜摄像并生成H264视频流
  15. 工具(2): 极简MarkDown排版介绍(How to)
  16. 安全工具acunetix使用
  17. openvpn 初步使用
  18. HashMap(不是线程安全)与ConcurrentHashMap(线程安全)
  19. iBt(001-004)原文与试译
  20. 洛谷P1742 最小圆覆盖(计算几何)

热门文章

  1. 带有pwn环境的Ubuntu22.04快速安装
  2. Rdt2.1 和 Rdt2.2的详细解释
  3. 2、第二种传输数据的形式:使用ajax传输数据,将前台的数据传输到后端
  4. 【k8s】k8s pv、pvc无法删除问题。
  5. disk磁盘分区软件使用教程,磁盘扩容无损备份
  6. Java 同步锁ReentrantLock与抽象同步队列AQS
  7. 更换K8S证书可用期
  8. Pthread 并发编程(三)——深入理解线程取消机制
  9. 基于python的数学建模---logicstic回归
  10. 基于.NET 7 的 WebTransport 实现双向通信