易学智能

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3738|回复: 0

[opencv] openCV【实践系列】9——使用OpenCV进行非真实感渲染

[复制链接]

27

主题

37

帖子

116

积分

论坛管理

Rank: 4

积分
116
发表于 2018-10-19 10:43:55 | 显示全部楼层 |阅读模式
本帖最后由 fantomas 于 2018-10-19 10:43 编辑

使用OpenCV进行非真实感渲染

图片1.png
1:渲染图

许多年前,当我还是学生时,我想编写一个过滤器来创建一个像图1所示的风格化/卡通化的图像。天真的我认为我可以使用高斯内核简单地模糊图像,分别检测边缘,并将两个图像组合以获得风格化图像。在大多数区域中所有图像看起来都很平滑之后,边缘会被保留。结果看起来很荒谬; 这是一个糟糕的主意!在我失败的实验几周后,我读到了双边滤波,这可能是计算机视觉中最常用的边缘保持平滑滤波器。虽然双边滤波完成了这项工作,但它很慢你永远不会在实时应用程序中使用它。
我很高兴看到在OpenCV 3中非常快速地实现了边缘保留滤波。结果与双边滤波非常相似,但速度更快。它是SIGGRAPH 2011论文的部分实现,题为Domain Transform for Edge-Aware Image and Video Processing,作者是Eduardo GastalManuel Oliveira。下一部分为有兴趣深入理解的人提供链接。
边缘感知过滤的域变换
作者Eduardo Gastal在他的项目页面上提供了很多材料来解释论文及其应用。如果您没有太多时间,下面的视频提供了该方法的出色高级概述。
在OpenCV 3中,本文使用Photo模块下的Computational Photography子模块中的四个函数实现。以下部分通过示例解释这些功能及其参数。在所有示例中,我们将使用下面的图像作为输入图像。
图片2.png
2:源图像
边缘保留滤波器(edgePreservingFilter)
这些过滤器中的第一个称为edgePreservingFilter
Python
  1. import cv2
  2. dst = cv2.edgePreservingFilter(src, flags=1, sigma_s=60, sigma_r=0.4)
复制代码
src:输入83通道的图像
dst:输出83通道的图像
flags:边缘保留滤波器,它取值RECURS_FILTER(递归过滤)=1NORMCONV_FILTER(归一化卷积)=2,使用RECURS_FILTER比使用NORMCONV_FILTER快约3.5倍。NORMCONV_FILTER会产生边缘锐化,并倾向于风格化应用,当你不希望锐化速度很重要时应该使用RECURS_FILTER。
sigma_s范围在0200之间(详见下文)
sigma_r范围在01之间(详见下文)
参数sigma_ssigma_r是什么意思?
图像处理和计算机视觉中的大多数平滑滤波器(例如高斯滤波器或盒滤波器)具有称为sigma_s(用于Sigma_Spatial)的参数,其确定平滑量。典型的平滑滤波器通过其邻域的加权和来替换像素的值。邻域越大,过滤后的图像越平滑。邻域的大小与参数sigma_s成正比。
在边缘保留滤波器中,有两个相互竞争的目标a)平滑图像b)不平滑边缘/颜色边界。换句话说,我们不能简单地用它的邻居的加权和来代替像素的颜色。相反,我们希望将像素中的颜色值替换为邻域中的像素的平均值,其也具有与像素类似的颜色。所以我们有两个参数:sigma_ssigma_r。就像其他平滑滤波器一样,sigma_s控制邻域的大小,而sigma_r(用于sigma_range)控制邻域内的不同颜色的平均值。较大的sigma_r导致大的恒定颜色区域。
结果(edgePreservingFilter)
edgePreservingFilterRECURS_FILTER一起应用的结果如图3所示
图片3.png
3edgePreservingFilter+RECURS_FILTER
施加的结果edgePreservingFilterNORMCONV_FILTER4所示。
图片4.png
4edgePreservingFilter+NORMCONV_FILTER
正如您所看到的,两个结果非常接近,因此我建议使用  RECURS_FILTER,因为它比NORMCONV_FILTER快。
细节增强滤波器(detailEnhance
顾名思义,这个滤波器可以增强细节,使图像更清晰
Python:
  1. import cv2
  2. dst = cv2.detailEnhance(src, sigma_s=10, sigma_r=0.15)
复制代码
参数与边缘增强滤波器相同
结果(detailEnhance
下图显示了结果细节增强滤波器。请注意,整个图像比输入图像更清晰。
图片5.png
5detailEnhance
铅笔素描滤波器(pencilSketch
此滤波器生成的输出看起来像铅笔草图。有两个输出,一个是将滤波应用于颜色输入图像的结果,另一个是将其应用于输入图像的灰度版本的结果。坦率地说,我对这个过滤器印象不深,因为结果看起来不太棒。
  1. import cv2
  2. dst_gray, dst_color = cv2.pencilSketch(src, sigma_s=60, sigma_r=0.07, shade_factor=0.05)
复制代码
数与边缘增强滤波器相同。shade_factor(范围00.1)是输出图像强度的简单缩放。值越高,结果越亮。
结果(pencilSketch
pencilSketch滤波器应用于输入图像的两种结果如6所示。
图片6.png

风格化滤波器(stylization)
风格化滤波器产生的输出图像看起来像使用水彩绘制的图像。
  1. import cv2
  2. dst = cv2.stylization(src, sigma_s=60, sigma_r=0.07)
复制代码
结果(stylization)
将stylization滤波器应用于输入图像的结果如7所示
图片7.png
7stylization
Image Credit:奶牛的形象是根据知识共享(CC by 2.0)获得许可的。你可以在这里找到它





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|易学智能

GMT+8, 2024-4-23 16:10 , Processed in 0.022707 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表