OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering() - 指南

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。

该函数将输入图像中的每个像素用其邻域内颜色分布的“模式”代替,从而实现:

  • 颜色平滑(去除噪声)
  • 边界保持
  • 图像分割的预处理

函数原型

void cv::cuda::meanShiftFiltering
(
InputArray src,
OutputArray dst,
int sp,
int sr,
TermCriteria criteria = TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 5
, 1
)
,
Stream & stream = Stream::Null(
)
)

参数

  • src 源图像。目前仅支持 CV_8UC4 类型的图像(即:8位无符号整型、4通道图像)。
  • dst 目标图像,包含映射后的点的颜色。它与源图像具有相同的尺寸和类型。
  • sp 空间窗口半径(以像素为单位)。
  • sr 颜色窗口半径(以颜色差异为单位)。
  • criteria 终止条件。参见 TermCriteria 结构体,用于控制算法迭代的最大次数或收敛精度。
  • stream 用于异步执行的 CUDA 流(Stream)。

代码示例

#
include <opencv2/cudaimgproc.hpp>
  #
  include <opencv2/opencv.hpp>
    int main(
    )
    {
    // Step 1: 读取图像
    cv::Mat h_src = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png"
    )
    ;
    if ( h_src.empty(
    )
    )
    {
    std::cerr <<
    "Failed to load image!" << std::endl;
    return -1
    ;
    }
    // Step 2: 转换为 4 通道图像(BGRA)
    cv::cuda::GpuMat d_src, d_src_rgba;
    d_src.upload( h_src )
    ;
    cv::cuda::cvtColor( d_src, d_src_rgba, cv::COLOR_BGR2BGRA )
    ;
    // 转为 CV_8UC4
    // Step 3: 创建输出图像
    cv::cuda::GpuMat d_dst;
    // Step 4: 设置参数并执行均值漂移滤波
    int sp = 10
    ;
    // 空间窗口大小
    int sr = 30
    ;
    // 颜色窗口大小
    cv::cuda::meanShiftFiltering( d_src_rgba, d_dst, sp, sr )
    ;
    // Step 5: 下载结果并显示
    cv::Mat h_dst;
    d_dst.download( h_dst )
    ;
    // Step 6: 如果需要恢复为 3 通道图像
    cv::cuda::GpuMat d_dst_bgr;
    cv::cuda::cvtColor( d_dst, d_dst_bgr, cv::COLOR_BGRA2BGR )
    ;
    cv::Mat h_final;
    d_dst_bgr.download( h_final )
    ;
    cv::imshow( "Original Image"
    , h_src )
    ;
    cv::imshow( "Filtered Image"
    , h_final )
    ;
    cv::waitKey( 0
    )
    ;
    return 0
    ;
    }

运行结果

在这里插入图片描述

posted on 2025-10-07 16:01  ljbguanli  阅读(3)  评论(0)    收藏  举报