- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在像素着色器中实现卷积对于非常多的纹理提取来说有些昂贵。
实现卷积过滤器的一种直接方法是使用每个片段的两个循环对每个片段进行 N x N 次查找。一个简单的计算表明,使用 4x4 高斯内核模糊的 1024x1024 图像需要 1024 x 1024 x 4 x 4 = 16M
查找。
对此我们能做些什么?
最佳答案
高斯内核是可分离的,这意味着您可以先进行水平传递,然后进行垂直传递(或相反)。这将 O(N^2) 变成 O(2N)。这适用于所有可分离过滤器,而不仅仅是模糊(并非所有过滤器都是可分离的,但许多过滤器是可分离的,有些是“一样好”)。
或者,在模糊过滤器(高斯或非高斯)的特殊情况下,它们都是“加权和”,您可以利用纹理插值,这对于小内核尺寸可能更快(但对于大内核尺寸绝对不是) )。
编辑:“线性插值”方法的图像
编辑(根据 Jerry Coffin 的要求)总结评论:
在“纹理过滤器”方法中,线性插值将根据从样本位置到纹素中心的反距离产生相邻纹素的加权和。这是由纹理硬件免费完成的。这样,16 个像素可以在 4 次提取中求和。除了分离内核之外,还可以利用纹理过滤。
在示例图像中,在左上角,您的样本(圆圈)击中了纹素的中心。你得到的和“最近的”过滤一样,你得到那个 texel 的值。在右上角,您位于两个纹素之间,您得到的是它们之间的 50/50 平均值(由较浅的蓝色着色器显示)。在右下角,您在 4 个纹素之间进行采样,但与左上角更接近一些。这为您提供了所有 4 个的加权平均值,但权重偏向左上角(最深的蓝色阴影)。
以下建议由 友情提供datenwolf (见下文):
“我想建议的另一种方法是在傅立叶空间中操作,其中卷积变成傅立叶变换信号和傅立叶变换内核的简单乘积。尽管在 GPU 上实现傅立叶变换本身非常繁琐,至少使用 OpenGL 着色器是这样。但是在OpenCL中很容易完成。实际上我使用OpenCL实现了这些东西,现在,我的3D引擎中的很多图像处理都发生在OpenCL中。
OpenCL 专为在 GPU 上运行而设计。快速傅立叶变换实际上是维基百科 OpenCL 文章中的一段示例代码:en.wikipedia.org/wiki/OpenCL,是的,性能提升是巨大的。 FFT 最多执行 O(n log n),反之亦然。可以预先计算滤波器内核傅立叶表示。方法是 FFT -> 与内核相乘 -> IFFT,归结为 O(n + 2n log n) 操作。请注意,那里的实际卷积只是 O(n)。
在可分离的有限卷积(如高斯模糊)的情况下,分离解决方案将优于傅立叶方法。但是在广义的、可能的不可分离内核的情况下,傅立叶方法可能是可用的最快方法。
OpenCL 与 OpenGL 很好地集成,例如您可以将 OpenGL 缓冲区(纹理和顶点)用于 OpenCL 程序的输入和输出。”
关于optimization - 在像素着色器中实现卷积过滤器的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5243983/
我之前让 dll 注入(inject)器变得简单,但我有 Windows 7,我用 C# 和 C++ 做了它,它工作得很好!但是现在当我在 Windows 8 中尝试相同的代码时,它似乎没有以正确的方
我正在尝试制作一个名为 core-splitter 的元素,该元素在 1.0 中已弃用,因为它在我们的项目中起着关键作用。 如果您不知道 core-splitter 的作用,我可以提供一个简短的描述。
我有几个不同的蜘蛛,想一次运行所有它们。基于 this和 this ,我可以在同一个进程中运行多个蜘蛛。但是,我不知道如何设计一个信号系统来在所有蜘蛛都完成后停止 react 器。 我试过了: cra
有没有办法在达到特定条件时停止扭曲 react 器。例如,如果一个变量被设置为某个值,那么 react 器应该停止吗? 最佳答案 理想情况下,您不会将变量设置为一个值并停止 react 器,而是调用
https://code.angularjs.org/1.0.0rc9/angular-1.0.0rc9.js 上面的链接定义了外部js文件,我不知道Angular-1.0.0rc9.js的注入(in
我正在尝试运行一个函数并将服务注入(inject)其中。我认为这可以使用 $injector 轻松完成.所以我尝试了以下(简化示例): angular.injector().invoke( [ "$q
在 google Guice 中,我可以使用函数 createInjector 创建基于多个模块的注入(inject)器。 因为我使用 GWT.create 在 GoogleGin 中实例化注入(in
我在 ASP.NET Core 1.1 解决方案中使用配置绑定(bind)。基本上,我在“ConfigureServices Startup”部分中有一些用于绑定(bind)的简单代码,如下所示: s
我在 Spring MVC 中设置 initBinder 时遇到一些问题。我有一个 ModelAttribute,它有一个有时会显示的字段。 public class Model { privat
我正在尝试通过jquery post发布knockoutjs View 模型 var $form = $('#barcodeTemplate form'); var data = ko.toJS(vm
如何为包含多态对象集合的复杂模型编写自定义模型绑定(bind)程序? 我有下一个模型结构: public class CustomAttributeValueViewModel { publi
您好,我正在尝试实现我在 this article 中找到的扩展方法对于简单的注入(inject)器,因为它不支持开箱即用的特定构造函数的注册。 根据这篇文章,我需要用一个假的委托(delegate)
你好,我想自动注册我的依赖项。 我现在拥有的是: public interface IRepository where T : class public interface IFolderReposi
我正在使用 Jasmine 测试一些 Angular.js 代码。为此,我需要一个 Angular 注入(inject)器: var injector = angular.injector(['ng'
我正在使用 Matlab 代码生成器。不可能包含代码风格指南。这就是为什么我正在寻找一个工具来“ reshape ”、重命名和重新格式化生成的代码,根据我的: 功能横幅约定 文件横幅约定 命名约定 等
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 8
我开发了一种工具,可以更改某些程序的外观。为此,我需要在某些进程中注入(inject)一个 dll。 现在我基本上使用这个 approach .问题通常是人们无法注入(inject) dll,因为他们
我想使用 swing、spring 和 hibernate 编写一个 java 应用程序。 我想使用数据绑定(bind)器用 bean 的值填充 gui,并且我还希望它反射(reflect) gui
我有这段代码,当两个蜘蛛完成后,程序仍在运行。 #!C:\Python27\python.exe from twisted.internet import reactor from scrapy.cr
要点是 Spring Batch (v2) 测试框架具有带有 @Autowired 注释的 JobLauncherTestUtils.setJob。我们的测试套件有多个 Job 类提供者。因为这个类不
我是一名优秀的程序员,十分优秀!