OpenCL实现SobelFilter(行列分解)

news2024/9/29 1:30:45

1.行列分解数学原理

row_filter=[1 0 -1], col_filter=[1 2 1]

 row_filter=[1 2 1], col_filter=[1 0 -1]

2.非局部内存实现

__kernel void sobel_filter_separable(__global uchar* padSrc, __global uchar* dst, int height, int width, int pad_width)
{
	__local short local_output_x[LOCAL_XRES * (LOCAL_YRES + FILTERSIZE - 1)];
	__local short local_output_y[LOCAL_XRES * (LOCAL_YRES + FILTERSIZE - 1)];

	uint col = get_global_id(0);
    uint row = get_global_id(1);

	if (col >= width || row >= height) return;

	int lid_x = get_local_id(0);
    int lid_y = get_local_id(1);

    int start_col = col; 
    
	/* row-wise */
	// row_filterx = [1 0 -1]
	local_output_x[lid_y * LOCAL_XRES + lid_x] = padSrc[row * pad_width + col] - padSrc[row * pad_width + col + 2];
	// row_filtery = [1 2 1]
	local_output_y[lid_y * LOCAL_XRES + lid_x] = padSrc[row * pad_width + col] + padSrc[row * pad_width + col + 1] * 2 + padSrc[row * pad_width + col + 2];
	           
	if (lid_y < FILTERSIZE - 1) {
		local_output_x[(lid_y + LOCAL_YRES) * LOCAL_XRES + lid_x] = padSrc[(row + LOCAL_YRES) * pad_width + col] - padSrc[(row + LOCAL_YRES) * pad_width + col + 2];
		local_output_y[(lid_y + LOCAL_YRES) * LOCAL_XRES + lid_x] = padSrc[(row + LOCAL_YRES) * pad_width + col] + padSrc[(row + LOCAL_YRES) * pad_width + col + 1] * 2 + padSrc[(row + LOCAL_YRES) * pad_width + col + 2];
	}
	
	barrier(CLK_LOCAL_MEM_FENCE); 

	/* col-wise */
	// col_filterx = [1 2 1]
	ushort sumx = abs(local_output_x[lid_y * LOCAL_XRES + lid_x] + local_output_x[(lid_y + 1) * LOCAL_XRES + lid_x] * 2 + local_output_x[(lid_y + 2) * LOCAL_XRES + lid_x]);
	// col_filtery = [1 0 -1]
	ushort sumy = abs(local_output_y[lid_y * LOCAL_XRES + lid_x] - local_output_y[(lid_y + 2) * LOCAL_XRES + lid_x]);

	dst[row * width + col] = clamp((convert_uchar)(sumx + sumy), (uchar)0, (uchar)255);
}

3.局部内存实现

__kernel void sobel_filter_separable_lds(__global uchar* padSrc, __global uchar* dst, int height, int width, int pad_width)
{
	__local short local_output_x[LOCAL_XRES * (LOCAL_YRES + FILTERSIZE - 1)];
	__local short local_output_y[LOCAL_XRES * (LOCAL_YRES + FILTERSIZE - 1)];
	__local uchar local_input[(LOCAL_XRES + FILTERSIZE - 1) * (LOCAL_YRES + FILTERSIZE - 1)];
	 
	uint col = get_global_id(0);
    uint row = get_global_id(1);

	if (col >= width || row >= height) return;

	int lid_x = get_local_id(0);
    int lid_y = get_local_id(1);

	int tile_xres = (LOCAL_XRES + FILTERSIZE - 1);
    int tile_yres = (LOCAL_YRES + FILTERSIZE - 1);

    int start_col = get_group_id(0) * LOCAL_XRES; 
    int start_row = get_group_id(1) * LOCAL_YRES; 
 
    int lid = lid_y * LOCAL_XRES + lid_x; 
    int gx, gy;
    
	do {
        gy = lid / tile_xres;
        gx = lid - gy * tile_xres; 
        
        local_input[lid] = padSrc[(start_row + gy) * pad_width + (start_col + gx)];
        lid += (LOCAL_XRES * LOCAL_YRES);
    } while (lid < (tile_xres * tile_yres));

    barrier(CLK_LOCAL_MEM_FENCE);

	/* row-wise */
	// row_filterx = [1 0 -1]
	local_output_x[lid_y * LOCAL_XRES + lid_x] = local_input[lid_y * tile_xres + lid_x] - local_input[lid_y * tile_xres + lid_x + 2];
	// row_filtery = [1 2 1]
	local_output_y[lid_y * LOCAL_XRES + lid_x] = local_input[lid_y * tile_xres + lid_x] + local_input[lid_y * tile_xres + lid_x + 1] * 2 + local_input[lid_y * tile_xres + lid_x + 2];
	           
	if (lid_y < FILTERSIZE - 1) {
		local_output_x[(lid_y + LOCAL_YRES) * LOCAL_XRES + lid_x] = local_input[(lid_y + LOCAL_YRES) * tile_xres + lid_x] - local_input[(lid_y + LOCAL_YRES) * tile_xres + lid_x + 2];
		local_output_y[(lid_y + LOCAL_YRES) * LOCAL_XRES + lid_x] = local_input[(lid_y + LOCAL_YRES) * tile_xres + lid_x] + local_input[(lid_y + LOCAL_YRES) * tile_xres + lid_x + 1] * 2 + local_input[(lid_y + LOCAL_YRES) * tile_xres + lid_x + 2];
	}
	
	barrier(CLK_LOCAL_MEM_FENCE); 

	/* col-wise */
	// col_filterx = [1 2 1]
	ushort sumx = abs(local_output_x[lid_y * LOCAL_XRES + lid_x] + local_output_x[(lid_y + 1) * LOCAL_XRES + lid_x] * 2 + local_output_x[(lid_y + 2) * LOCAL_XRES + lid_x]);
	// col_filtery = [1 0 -1]
	ushort sumy = abs(local_output_y[lid_y * LOCAL_XRES + lid_x] - local_output_y[(lid_y + 2) * LOCAL_XRES + lid_x]);

	dst[row * width + col] = clamp((convert_uchar)(sumx + sumy), (uchar)0, (uchar)255);
}

输入数据局部内存初始化原理参考下图

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/906552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习 | 分类指标大全】全面解析分类评估指标:从准确率到AUC,多分类问题也不在话下, 确定不来看看?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

上传镜像到阿里云的ACR

1、开通阿里云ACR 2、在ACR 中创建命名空间 3、本地安装docker 4、登录到 开通ACR&#xff0c;需要配置访问凭证 [rootmaster ~]# docker login --username***lb registry.cn-beijing.aliyuncs.com Password: 5、给镜像打标签 [rootmaster ~]# docker images REPOSITORY …

❤ Vue工作常用的一些动态数据和方法处理

❤ Vue工作常用的一些动态数据和方法处理 &#xff08;1&#xff09;动态拼接相对路径结尾的svg 错误写法一 ❌ 正确写法 &#x1f646; <img :src"require(/assets//amazon/svg/homemenu${index}.svg)" style"height: 20px;display: block;margin: 0 au…

操作系统-笔记-第三章-内存管理

目录 三、第三章——内存管理 1、内存的基础知识 &#xff08;1.1&#xff09;程序装入&#xff08;三种&#xff09;——绝对装入 &#xff08;1.2&#xff09;程序装入&#xff08;三种&#xff09;——可重定位装入 &#xff08;1.3&#xff09;程序装入&#xff08;三…

[b01lers2020]Life on Mars1

打开靶场 直接bp抓包 多次点击左侧超链接 发现/query?search这个参数一直在发生改变 可以发现它返回了json格式的数据&#xff0c;猜测是sql注入 放进hackbar进行操作 orderby进行判断 http://6f5976a0-0364-4c05-a7f5-6f0c863e7e41.node4.buuoj.cn:81/query?searchamazonis…

铜矿人员定位安全方案

针对铜矿中的人员定位安全需求&#xff0c;可以采用以下方案&#xff1a; 1.实时人员定位系统&#xff1a;建立一个实时人员定位系统&#xff0c;通过在矿工的工作服或安全帽上安装UWB或RFID定位设备&#xff0c;以及相应的接收器和基站&#xff0c;实时跟踪和定位矿工的位置。…

苍穹外卖 day2 反向代理和负载均衡

一 前端发送的请求&#xff0c;是如何请求到后端服务 前端请求地址&#xff1a;http://localhost/api/employee/login 路径并不匹配 后端接口地址&#xff1a;http://localhost:8080/admin/employee/login 二 查找前端接口 在这个页面上点击f12 后转到networ验证&#xff0…

高并发内存池(PageCache)[3]

原理 PageCache 共128页 static const size_t NPAGES 128;centralcache向pagecache申请2page时&#xff0c;首先向下扫描&#xff0c;有大的会切分出来&#xff0c;然后再挂在对应桶当中 centralcache从pagecache获取span 计算一次获取几页 static const size_t PAGE_SH…

Servlet+Jsp+JDBC实现房屋租赁管理系统(源码+数据库+论文+系统详细配置指导+ppt)

一、项目简介 本项目是一套基于ServletJsp房屋租赁管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;…

如何最简单、通俗地理解什么是机器学习?

那就究竟什么是学习呢?诺贝尔经济学奖和图灵奖双料得主、卡耐基梅隆大学的赫伯特 西蒙 (Herbert Simon) 教授是这样定义的&#xff1a;“学习是系统通过经验提升性能的过程”。可以看到&#xff0c;学习是一个过程&#xff0c;并且这里有3个关键词&#xff0c;即经验、提升和…

【万能模型训练方法】你没看错,就这么简单

1. 只支持DF结构(Liaef结构特殊&#xff0c;不支持true face机制) 2. dst丢各种人脸数据进去&#xff0c;越杂越好&#xff0c;src保持单人数据 3. 训练时把true face参数打开&#xff0c;推荐0.01 你可以在别的DF预训练模型上&#xff0c;按上述方法练。然后就挂机练&#xff…

GaussDB之应用无损透明(ALT)

1. 背景 GaussDB作为一款企业级分布式数据库&#xff0c;提供了“同城跨AZ双活、两地三中心、双集群强一致”等极致的高可用容灾能力。当某个数据库节点由于故障无法对外提供服务时&#xff0c;为了继续保证数据库服务的可用性&#xff0c;JDBC驱动会将业务后续的数据库连接请…

Python入门--变量和数据类型

什么是变量&#xff1f; 在编程中&#xff0c;变量是指内存中的一段存储空间&#xff0c;用于存储数据。使用变量可以方便地存储数据并在程序中进行操作。 如何定义变量&#xff1f; 在Python中&#xff0c;可以使用“”符号来定义变量&#xff0c;例如&#xff1a; a 1 b …

python刷小红书流量(小眼睛笔记访问量),metrics_report接口,原理及代码,以及x-s签名验证2023-08-21

一、什么是小眼睛笔记访问量 如下图所示&#xff0c;为笔记访问量。 二、小眼睛笔记访问量接口 1、url https://edith.xiaohongshu.com/api/sns/web/v1/note/metrics_report 2、payload data{"note_id": note_id,"note_type": note_type,"report_t…

Linux解决RocketMQ中NameServer启动问题

启动步骤可以查看官网&#xff0c;https://github.com/apache/rocketmq 一下说明遇到的问题。 1&#xff1a;ROCKETMQ_HOME问题 根据官网提示进入mq/bin目录下&#xff0c;可以使用./mqnamesrv进行NameServer启动&#xff0c;但是会遇到第一个问题&#xff0c;首次下载Rocket…

变量与条件语句

目录 1、何为变量 变量的基础知识 1.1、取名字 1.2、弱引用和强引用 1.3、read -p 1.4、变量的作用范围 1.5、运算&#xff08;整数&#xff09; 1.6、环境变量 1.7、位置变量 1.8、预设变量 2、条件语句 2.1、测试 2.1.1、比较整数数值 2.1.2、字符串比较 2.1.…

“智能监测”进泵房,管理开了“千里眼”

生活水泵房和消防水泵房作为楼宇中的主要基础设施之一&#xff0c;传统的生活水泵房和消防水泵房操作繁琐&#xff0c;需要人工控制&#xff0c;耗费大量成本。泵房的监测和维护工作困难&#xff0c;存在隐患无法及时发现和解决。此外&#xff0c;泵房的设备老化和能效低下&…

积跬步至千里 || 矩阵可视化

矩阵可视化 矩阵可以很方面地展示事物两两之间的关系&#xff0c;这种关系可以通过矩阵可视化的方式进行简单监控。 定义一个通用类 from matplotlib import pyplot as plt import seaborn as sns import numpy as np import pandas as pdclass matrix_monitor():def __init…

[C++ 网络协议编程] 域名及网络地址

1. DNS服务器 DNS&#xff08;Domain Name System&#xff09;&#xff1a;是对IP地址和域名&#xff08;如:www.baidu.com等&#xff09;进行相互转换的系统&#xff0c;其核心是DNS服务器。 我们输入的www.baidu.com是域名&#xff0c;是一种虚拟地址&#xff0c;而非实际地…

图论基础和表示(Java 实例代码)

目录 图论基础和表示 一、概念及其介绍 二、适用说明 三、图的表达形式 Java 实例代码 src/runoob/graph/DenseGraph.java 文件代码&#xff1a; src/runoob/graph/SparseGraph.java 文件代码&#xff1a; 图论基础和表示 一、概念及其介绍 图论(Graph Theory)是离散数…