图像去噪算法:NL-Means和BM3D(转载+个人笔记)

       由于NL-Means是基于图像块进行搜索的,所有可以在上面的6组示例图中可以看到,权重较大是与目标点邻域相似的区域,有点类似模式识别,思路是通过高斯加权欧式距离找到曲线与与目标点邻域相似的区域,利用其信息进行去噪。

    简单做一个NL-Means去噪算法的总结,对于图像中的每一个像素,去噪后的结果是周围像素的加权和,权重是由该像素点与周围像素点的相似程度确定的,相似程度由块邻域的高斯加权欧式距离计算得到。

  • 5
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个简单的NL-meansMATLAB算法: ```matlab function [denoisedImg] = nlMeansDenoising(noisyImg, patchSize, windowSize, h) % Input: % noisyImg - 带有声的图像 % patchSize - 每个块的大小 % windowSize - 用于搜索相似块的窗口大小 % h - 控制去强度的参数 % Output: % denoisedImg - 去后的图像 % 转换为灰度图像 if size(noisyImg, 3) == 3 noisyImg = rgb2gray(noisyImg); end % 复制一份图像作为去后的图像的初始值 denoisedImg = double(noisyImg); % 计算图像中每个像素周围的块 halfPatchSize = floor(patchSize/2); halfWindowSize = floor(windowSize/2); [rows, cols] = size(noisyImg); paddedImg = padarray(noisyImg, [halfWindowSize halfWindowSize], 'symmetric'); for i = 1+halfWindowSize:rows+halfWindowSize for j = 1+halfWindowSize:cols+halfWindowSize % 获取以(i,j)为中心的块 i1 = i - halfPatchSize; i2 = i + halfPatchSize; j1 = j - halfPatchSize; j2 = j + halfPatchSize; patch = paddedImg(i1:i2, j1:j2); % 在以(i,j)为中心的窗口内搜索相似块 w1 = i - halfWindowSize; w2 = i + halfWindowSize; h1 = j - halfWindowSize; h2 = j + halfWindowSize; searchWindow = paddedImg(w1:w2, h1:h2); [searchRows, searchCols] = size(searchWindow); minMSE = Inf; for m = 1:searchRows-halfPatchSize*2 for n = 1:searchCols-halfPatchSize*2 % 获取搜索窗口中的相似块 m1 = m + halfWindowSize; m2 = m + halfWindowSize + patchSize - 1; n1 = n + halfWindowSize; n2 = n + halfWindowSize + patchSize - 1; similarPatch = searchWindow(m1:m2, n1:n2); % 计算均方误差 mse = sum(sum((patch-similarPatch).^2))/(patchSize^2); % 记录最小的均方误差和相似块的位置 if mse < minMSE minMSE = mse; minM = m; minN = n; end end end % 计算权重并进行去 weightSum = 0; weightedPatchSum = 0; for m = minM:minM+patchSize-1 for n = minN:minN+patchSize-1 % 获取搜索窗口中的相似块 m1 = m + halfWindowSize; m2 = m + halfWindowSize + patchSize - 1; n1 = n + halfWindowSize; n2 = n + halfWindowSize + patchSize - 1; similarPatch = searchWindow(m1:m2, n1:n2); % 计算相似块与目标块的权重 weight = exp(-minMSE/(h^2)); weightedPatchSum = weightedPatchSum + weight*similarPatch; weightSum = weightSum + weight; end end denoisedImg(i-halfWindowSize, j-halfWindowSize) = weightedPatchSum/weightSum; end end % 转换图像类型为uint8 denoisedImg = uint8(denoisedImg); end ``` 其中,`noisyImg`为带有声的输入图像,`patchSize`为每个块的大小,`windowSize`为用于搜索相似块的窗口大小,`h`为控制去强度的参数。函数返回去后的图像`denoisedImg`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值