概述
这个例子介绍OpenCV中Photo模块的各种图像处理方法,主要用于图像美化和艺术效果处理。主要包括边缘保持滤波、细节增强、铅笔画效果与风格化。
效果:
实践
先来看下边缘保持滤波的这两个:
// 边缘保持滤波 - NormconvFilter using var normconv = new Mat(); Cv2.EdgePreservingFilter(_originalMat, normconv, EdgePreservingMethods.NormconvFilter); NormconvImage = ConvertMatToBitmapImage(normconv); // 边缘保持滤波 - RecursFilter using var recursFiltered = new Mat(); Cv2.EdgePreservingFilter(_originalMat, recursFiltered, EdgePreservingMethods.RecursFilter); RecursFilteredImage = ConvertMatToBitmapImage(recursFiltered);来看下Cv2.EdgePreservingFilter的函数签名:
public static void EdgePreservingFilter(InputArray src, OutputArray dst, EdgePreservingMethods flags = EdgePreservingMethods.RecursFilter, float sigmaS = 60f, float sigmaR = 0.4f)EdgePreservingFilter 是 OpenCV 中的一种边缘保持平滑滤波器,它能够在平滑图像的同时保持边缘的清晰度。这种滤波技术在许多计算机视觉应用中非常有用,如 HDR 成像、图像增强和艺术效果处理等。
查看参数含义:
参数名 | 类型 | 含义 | 取值范围 |
|---|---|---|---|
src | InputArray | 输入的 8 位 3 通道图像 | - |
dst | OutputArray | 输出的 8 位 3 通道图像 | - |
flags | EdgePreservingMethods | 边缘保持滤波方法 | RECURS_FILTER, NORMCONV_FILTER |
sigmaS | float | 范围参数,控制平滑程度 | 0 到 200 |
sigmaR | float | 空间参数,控制边缘保持程度 | 0 到 1 |
sigmaS 参数调优:
平滑程度 | 推荐值 | 效果 |
|---|---|---|
轻度平滑 | 20-50 | 保留更多细节 |
中度平滑 | 50-100 | 平衡效果 |
重度平滑 | 100-200 | 明显平滑效果 |
sigmaR 参数调优:
边缘保持强度 | 推荐值 | 效果 |
|---|---|---|
强边缘保持 | 0.1-0.3 | 边缘清晰,平滑较少 |
平衡效果 | 0.3-0.5 | 适中的边缘保持 |
更多平滑 | 0.5-1.0 | 更多平滑,边缘模糊 |
再来看下细节增强:
// 细节增强 using var detailEnhance = new Mat(); Cv2.DetailEnhance(_originalMat, detailEnhance); DetailEnhanceImage = ConvertMatToBitmapImage(detailEnhance);查看Cv2.DetailEnhance的函数签名:
public static void DetailEnhance(InputArray src, OutputArray dst, float sigmaS = 10f, float sigmaR = 0.15f)DetailEnhance 是 OpenCV 中的一种细节增强滤波器,专门用于增强图像中的细节信息。与边缘保持滤波器不同,这个函数的主要目标是突出图像中的细节,使图像看起来更加清晰和生动。
查看参数:
参数名 | 类型 | 含义 | 取值范围 |
|---|---|---|---|
src | InputArray | 输入的 8 位 3 通道图像 | - |
dst | OutputArray | 输出图像,与 src 具有相同大小和类型 | - |
sigmaS | float | 空间窗口大小参数 | 0 到 200 |
sigmaR | float | 颜色相似度参数 | 0 到 1 |
现在来看下铅笔画:
// 铅笔画 - 灰度和彩色 using var pencil1 = new Mat(); using var pencil2 = new Mat(); Cv2.PencilSketch(_originalMat, pencil1, pencil2); Pencil1Image = ConvertMatToBitmapImage(pencil1); Pencil2Image = ConvertMatToBitmapImage(pencil2);查看Cv2.PencilSketch的函数签名:
public static void PencilSketch(InputArray src, OutputArray dst1, OutputArray dst2, float sigmaS = 60f, float sigmaR = 0.07f, float shadeFactor = 0.02f)PencilSketch 是 OpenCV 中的一种非真实感渲染滤波器,用于创建铅笔素描风格的图像效果。该函数可以生成两种输出:一种是黑白线条素描,另一种是彩色素描效果。
查看参数:
参数名 | 类型 | 含义 | 取值范围 |
|---|---|---|---|
src | InputArray | 输入的 8 位 3 通道图像 | - |
dst1 | OutputArray | 输出的 8 位 1 通道黑白素描图像 | - |
dst2 | OutputArray | 输出的与 src 相同大小和类型的彩色素描图像 | - |
sigmaS | float | 空间窗口大小参数 | 0 到 200 |
sigmaR | float | 颜色相似度参数 | 0 到 1 |
shadeFactor | float | 阴影因子参数 | 0 到 0.1 |
sigmaS 参数调优
线条粗细 | 推荐值 | 效果 |
|---|---|---|
细线条 | 20-50 | 精细素描,保留更多细节 |
中等线条 | 50-100 | 标准素描效果,适合大多数场景 |
粗线条 | 100-200 | 粗犷素描风格,艺术效果明显 |
sigmaR 参数调优
颜色分离度 | 推荐值 | 效果 |
|---|---|---|
强颜色分离 | 0.05-0.15 | 清晰线条,适合细节丰富的图像 |
平衡效果 | 0.15-0.3 | 适中的线条清晰度 |
颜色混合 | 0.3-1.0 | 模糊线条,柔和效果 |
shadeFactor 参数调优
明暗程度 | 推荐值 | 效果 |
|---|---|---|
明亮素描 | 0.01-0.03 | 线条较淡,适合浅色图像 |
标准素描 | 0.03-0.05 | 适中的明暗对比 |
暗调素描 | 0.05-0.1 | 线条明显,适合高对比度效果 |
参数组合效果
sigmaS | sigmaR | shadeFactor | 效果描述 |
|---|---|---|---|
小(20-50) | 小(0.05-0.15) | 小(0.01-0.03) | 精细明亮素描,适合人像 |
小(20-50) | 大(0.3-1.0) | 大(0.05-0.1) | 细线条暗调素描,艺术效果 |
中(50-100) | 小(0.05-0.15) | 中(0.03-0.05) | 标准素描效果,适合风景 |
中(50-100) | 大(0.3-1.0) | 大(0.05-0.1) | 中等线条暗调素描,平衡效果 |
大(100-200) | 小(0.05-0.15) | 小(0.01-0.03) | 粗线条明亮素描,特殊效果 |
大(100-200) | 大(0.3-1.0) | 大(0.05-0.1) | 粗犷暗调素描,强烈艺术风格 |
实际应用建议
应用场景 | sigmaS | sigmaR | shadeFactor | 效果 |
|---|---|---|---|---|
人像素描 | 40-70 | 0.05-0.1 | 0.02-0.04 | 保留面部特征 |
风景素描 | 60-100 | 0.07-0.15 | 0.03-0.05 | 突出自然景观 |
建筑素描 | 50-80 | 0.05-0.1 | 0.02-0.04 | 突出建筑结构 |
艺术创作 | 80-150 | 0.1-0.2 | 0.04-0.08 | 强烈艺术效果 |
卡通效果 | 30-60 | 0.15-0.3 | 0.02-0.03 | 柔和卡通风格 |
再来看下风格化:
// 风格化 using var stylized = new Mat(); Cv2.Stylization(_originalMat, stylized); StylizedImage = ConvertMatToBitmapImage(stylized);查看Cv2.Stylization的函数签名:
public static void Stylization(InputArray src, OutputArray dst, float sigmaS = 60f, float sigmaR = 0.45f)Stylization 是 OpenCV 中的一种非真实感渲染滤波器,用于创建艺术风格化的图像效果。该函数通过平滑低对比度区域同时保持或增强高对比度特征,实现图像的风格化处理,不专注于真实感而是追求多样化的艺术效果。
基本参数
参数名 | 类型 | 含义 | 取值范围 |
|---|---|---|---|
src | InputArray | 输入的 8 位 3 通道图像 | - |
dst | OutputArray | 输出的与 src 相同大小和类型的图像 | - |
sigmaS | float | 空间窗口大小参数 | 0 到 200 |
sigmaR | float | 颜色相似度参数 | 0 到 1 |
sigmaS 参数调优
平滑程度 | 推荐值 | 效果 |
|---|---|---|
轻度平滑 | 20-50 | 保留更多细节,轻微风格化 |
中度平滑 | 50-100 | 平衡效果,适合大多数场景 |
重度平滑 | 100-200 | 强烈风格化,艺术效果明显 |
sigmaR 参数调优
颜色分离度 | 推荐值 | 效果 |
|---|---|---|
强颜色分离 | 0.05-0.3 | 保持颜色边界,清晰区域分离 |
平衡效果 | 0.3-0.6 | 适中的颜色混合和风格化 |
颜色混合 | 0.6-1.0 | 强烈颜色混合,平滑过渡 |