首页 > 其他分享 >OpenCL 实现Sobel边界检测过滤

OpenCL 实现Sobel边界检测过滤

时间:2024-10-30 10:16:16浏览次数:3  
标签:src Sobel read xyz OpenCL imagef 边界检测 int2 float4

1. Sobel边界检测过滤器

        Sobel算子是计算机视觉领域的一种重要处理方法。主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测。 Sobel算子是把图像中每个像素的上下左右四邻域的灰度值加权差,在边缘处达到极值从而检测边缘。

        在边缘检测中,常用的一种模板是Sobel 算子。Sobel 算子有两个,一个是检测水平边缘的 ;另一个是检测垂直边缘的 。与Prewitt算子相比,Sobel算子对于象素的位置的影响做了加权,可以降低边缘模糊程度,因此效果更好。

        Sobel算子另一种形式是各向同性Sobel(Isotropic Sobel)算子,也有两个,一个是检测水平边缘的 ,另一个是检测垂直边缘的 。各向同性Sobel算子和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。将Sobel算子矩阵中的所有2改为根号2,就能得到各向同性Sobel的矩阵。

        该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像,其公式如下:

G_{x} = \begin{bmatrix} -1& 0 & +1\\ -2& 0 & +2\\ -1& 0 & +1 \end{bmatrix}             G_{y} = \begin{bmatrix} -1& -2 & -1\\ 0& 0 & 0\\ -1& +2 & +1 \end{bmatrix}   

        图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。

G = \sqrt{G_{x}^{2} + G_{y}^{2}}

2. OpenCL 内核实现Sobel

2.1 RGB方式实现

sobel_rgb.cl代码:

/**
//         Gx = {{-1, 0, +1},
//               {-2, 0, +2},
//               {-1, 0, +1}}
//         Gy = {{-1, -2, -1},
//               { 0,  0,  0},
//               {+1, +2, +1}}

kernel void sobel_rgb(read_only image2d_t src, write_only image2d_t dst)
{
    int x = (int)get_global_id(0);
    int y = (int)get_global_id(1);
    if (x >= get_image_width(src) || y >= get_image_height(src))
        return;
    float4 p00 = read_imagef(src, sampler, (int2)(x - 1, y - 1));
    float4 p10 = read_imagef(src, sampler, (int2)(x, y - 1));
    float4 p20 = read_imagef(src, sampler, (int2)(x + 1, y - 1));

    float4 p01 = read_imagef(src, sampler, (int2)(x - 1, y));
    float4 p21 = read_imagef(src, sampler, (int2)(x + 1, y));

    float4 p02 = read_imagef(src, sampler, (int2)(x - 1, y + 1));
    float4 p12 = read_imagef(src, sampler, (int2)(x, y + 1));

    float4 p22 = read_imagef(src, sampler, (int2)(x + 1, y + 1));

    float3 gx = -p00.xyz + p20.xyz + 2.0f * (p21.xyz - p01.xyz) - p02.xyz + p22.xyz;

    float3 gy =  -p00.xyz + p20.xyz + 2.0f * (p12.xyz - p10.xyz) - p02.xyz + p22.xyz;

    float3 g = native_sqrt(gx * gx + gy * gy);
    write_imagef(dst, (int2)(x, y), (float4)(g.x, g.y, g.z, 1.0f));
}

2.2 灰度图实现

sobel_grayscale.cl

/**
//         Gx = {{-1, 0, +1},
//               {-2, 0, +2},
//               {-1, 0, +1}}
//         Gy = {{-1, -2, -1},
//               { 0,  0,  0},
//               {+1, +2, +1}}

kernel void sobel_grayscale(read_only image2d_t src, write_only image2d_t dst)
{
    int x = (int)get_global_id(0);
    int y = (int)get_global_id(1);
    if (x >= get_image_width(src) || y >= get_image_height(src))
        return;
    float4 p00 = read_imagef(src, sampler, (int2)(x - 1, y - 1));
    float4 p10 = read_imagef(src, sampler, (int2)(x, y - 1));
    float4 p20 = read_imagef(src, sampler, (int2)(x + 1, y - 1));

    float4 p01 = read_imagef(src, sampler, (int2)(x - 1, y));
    float4 p21 = read_imagef(src, sampler, (int2)(x + 1, y));

    float4 p02 = read_imagef(src, sampler, (int2)(x - 1, y + 1));
    float4 p12 = read_imagef(src, sampler, (int2)(x, y + 1));

    float4 p22 = read_imagef(src, sampler, (int2)(x + 1, y + 1));

    float3 gx = -p00.xyz + p20.xyz + 2.0f * (p21.xyz - p01.xyz) - p02.xyz + p22.xyz;

    float3 gy =  -p00.xyz + p20.xyz + 2.0f * (p12.xyz - p10.xyz) - p02.xyz + p22.xyz;

    float gs_x = 0.3333f * (gx.x + gx.y + gx.z);
    float gs_y = 0.3333f * (gy.x + gy.y + gy.z);
    float3 g = native_sqrt(gs_x * gs_x + gs_y * gs_y);
    write_imagef(dst, (int2)(x, y), (float4)(g, g, g, 1.0f));
}

3.参考文献

1. 《OpenGL编程指南》

2.《百度百科 Sobel算子》

标签:src,Sobel,read,xyz,OpenCL,imagef,边界检测,int2,float4
From: https://blog.csdn.net/dengfuma/article/details/143321943

相关文章

  • Python实现图像(边缘)锐化:梯度锐化、Roberts 算子、Laplace算子、Sobel算子的详细方法
    目录Python实现图像(边缘)锐化:梯度锐化、Roberts算子、Laplace算子、Sobel算子的详细方法引言一、图像锐化的基本原理1.1什么是图像锐化?1.2边缘检测的基本概念二、常用的图像锐化算法2.1梯度锐化2.1.1实现步骤2.2Roberts算子2.2.1实现步骤2.3Laplace算子2.3.1实......
  • CUDA和OpenCL在GPU加速计算上有什么区别
    在GPU加速计算领域,CUDA和OpenCL是两种主流的编程框架。它们之间的主要区别包括:1.平台兼容性不同;2.性能优化不同;3.语言支持不同;4.生态系统和社区支持不同;5.应用领域不同。CUDA是由NVIDIA推出,专为其GPU设计,因此在NVIDIA硬件上提供了优化的性能。相比之下,OpenCL是一个开放标准,在跨平......
  • OpenCV(cv::Sobel())
    目录1.函数定义2.工作原理2.1Sobel核2.2计算过程(1)x方向的Sobel卷积计算(2)y方向的Sobel卷积计算(3)合并x和y方向的梯度2.3示例3.示例4.使用场景总结cv::Sobel()是OpenCV中用于计算图像的梯度(边缘)的常用函数之一。它实现了Sobel滤波器,这是一种常见......
  • 《圣剑传说Visions of Mana》游戏崩溃黑屏提示“找不到OpenCL.dll”该怎么修复?圣剑传
    当《圣剑传说VisionsofMana》游戏崩溃黑屏提示“找不到OpenCL.dll”时,可尝试以下方法修复。首先,从正规网站下载与系统匹配的OpenCL.dll文件。然后将其放入系统目录中,如System32文件夹。还可以检查显卡驱动,更新或重新安装显卡驱动程序。本篇将为大家带来《圣剑传说Visionsof......
  • Opencl从零实战(一)--windows搭建开发环境
    系统win11visualstudio2022opencl3.0库:Releases·KhronosGroup/OpenCL-SDK(github.com)在新建的解决方案中项目->[项目名称]和属性点选c/c++->常规->附件包含目录->编辑,将自己下载的oepnclsdk的include路径填进去,作为头文件的引用目录点选链接器->常规->附加库......
  • 图像边缘检测技术详解:利用OpenCV实现Sobel算子
    图像边缘检测技术详解:利用OpenCV实现Sobel算子前言Sobel算子的原理代码演示结果展示结语前言  在数字图像处理的广阔领域中,边缘检测技术扮演着至关重要的角色。无论是在科学研究、工业自动化,还是在日常生活中的智能设备中,我们都需要从图像中提取有用的信息。边缘,作......
  • 关于MNN的OPENCL和Vulkan支持
    关于MNN框架推理的时候,通过调用库当中结构体的内容,可以切换选择创建Session的具体配置。关于结构的描述见官方文档:官方文档——创建SessionCPU是编译的时候默认选择的配置方式,通过文档可知在结构体:MNN::ScheduleConfig当中有可以选择的2个成员,分别是:type(配置方式)numThread(......
  • OpenCloudOS 8.10 发布:全面兼容企业级 Linux 生态 ,引入更多新 module
    2024年8月,OpenCloudOS社区年度新版本OpenCloudOS8.10正式发布。全面兼容RHEL 8.10用户态包,引入Python3.12软件包,更新GCCToolset13、LLVMToolset17,RustToolset1.75.0,GoToolset1.21.0等编译器和开发工具。OpenCloudOS8.10采用Kernel5.4LTS版本(内核小......
  • 使用 Sobel 算子理解梯度组合策略输出
    我尝试实现一个SobelEdge检测器,如下所示:defsobel(img):img=cv2.GaussianBlur(img,(5,5),0)filter_x=np.array([[-1,0,1],[-2,0,2],[-1,0,1]])filter_y=np.array([[-1,-2,-1],......
  • opencloudosV8.6和openEuler 24安装 k8s
    在三台机器上部署Kubernetes集群1.环境准备2.在所有节点上进行以下步骤1.更新系统和安装必要的软件包2.禁用交换分区3.禁用防火墙和SElinux4.系统主机名5.设置主机名与IP地址解析6.配置内核转发及网桥过滤7.配置DockerCgroup驱动8.添加Kubernetes仓库并安装......