- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
使用非局部均值去噪算法(Non-local Means Denoising algorithm)执行图像去噪,该算法来源于 http://www.ipol.im/pub/algo/bcm_non_local_means_denoising,并包含了若干计算优化。预期噪声为高斯白噪声。
cv::cuda::fastNlMeansDenoising 是 OpenCV 的 CUDA 模块中用于图像去噪的一个函数。此函数实现了快速非局部均值去噪算法,旨在减少图像中的噪声同时尽可能保留边缘细节。
函数原型
void cv::cuda::fastNlMeansDenoising
(
InputArray src,
OutputArray dst,
float h,
int search_window = 21,
int block_size = 7,
Stream & stream = Stream::Null()
)
参数
- 参数src 输入8位1通道、2通道或3通道的图像。
- 参数sdst 与 src 具有相同大小和类型的输出图像。
- 参数sh 调节滤波强度的参数。较大的 h 值能完美地去除噪声,但也会去除图像细节;较小的 h 值则会保留细节,但也会保留一些噪声。
- 参数ssearch_window 用于计算给定像素加权平均值的窗口大小(以像素为单位)。应该是奇数。性能受其影响呈线性关系:更大的 search_window 意味着更长的去噪时间。推荐值为21像素。
- 参数sblock_size 用于计算权重的模板块大小(以像素为单位)。应该是奇数。推荐值为7像素。
- 参数sstream 用于异步调用的流。 该函数预期应用于灰度图像。对于彩色图像,请参阅 FastNonLocalMeansDenoising::labMethod。
代码示例
电脑没有Nvidia的显卡,程序编译不了,opencv不支持cuda的也编译不了。
#include <opencv2/opencv.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/core/cuda.hpp>
int main() {
// 加载输入图像
cv::Mat src = cv::imread("noisy_image.jpg", cv::IMREAD_COLOR);
if (src.empty()) {
std::cerr << "无法加载图像文件" << std::endl;
return -1;
}
// 创建与src相同大小和类型的输出图像dst
cv::Mat dst;
// 将输入图像上传到GPU
cv::cuda::GpuMat gpu_src, gpu_dst;
gpu_src.upload(src);
// 创建CUDA流(可选)
cv::cuda::Stream stream;
// 应用快速非局部均值去噪算法
cv::cuda::fastNlMeansDenoising(gpu_src, gpu_dst, 3.0f /* h */, 21 /* search_window */, 7 /* block_size */, stream);
// 将去噪后的图像从GPU下载到CPU
gpu_dst.download(dst);
// 保存去噪后的图像
cv::imwrite("denoised_image.jpg", dst);
// 显示原始图像和去噪后的图像
cv::imshow("Noisy Image", src);
cv::imshow("Denoised Image", dst);
cv::waitKey();
return 0;
}