Hello Mat

 找回密码
 立即注册
查看: 5989|回复: 0

约束最小平方滤波

[复制链接]

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
发表于 2017-9-21 21:39:05 | 显示全部楼层 |阅读模式
约束最小平方滤波
% 约束最小平方滤波
Xd = im2double(im);
HSIZE = [3 3];   % 模板窗口大小
SIGMA = 0.5;     % 标准差
H = fspecial('gaussian',HSIZE,SIGMA);
noise_power = noise_var * prod(size(Xd));   % prod(size(Xd))=65536;噪声的功率
[Zd, LAGRA] = deconvreg_filter(im,H,noise_power);  % 应用约束最小平方滤波

  1. function [J, LAGRA] = deconvreg_filter(I,PSF,NP)
  2. % 约束最小平方滤波器
  3. %函数输入:
  4. %        I:   输入的二维图像矩阵
  5. %        PSF: 退化函数的空域模板
  6. %        NP:  表示噪声的功率
  7. %函数输出:
  8. %        J: 约束最小平方滤波图像
  9. %        LAGRA: 可以为一个数值,表示指定约束最小平方的最佳复原参数y,
  10. %               也可以为[min,max]形式,表示参数y的搜索范围
  11. %               若此参数省略,则表示搜索范围为[1e-9,1e9] 。

  12. % 约束最小平方滤波
  13. if ~isa(I,'double')
  14.     I = double(I)/255;
  15. end
  16. LR = [1e-9 1e9];    % 复原参数搜索范围
  17. % 求解输入图像维数
  18. sizeI = size(I);
  19. % PSF 矩阵
  20. sizePSF = size(PSF);
  21. % 输入图像的维数求解
  22. numNSdim = find(sizePSF~=1);
  23. NSD = length(numNSdim);
  24. % 转化PSF函数到期望的维数 光传递函数OTF
  25. otf = psf2otf(PSF,sizeI);
  26. % regop:通过计算拉普拉斯算子计算图像的平滑性
  27. % 具体见表达式(10.23)
  28. if NSD == 1,
  29.     regop = [1 -2 1];
  30. else % 二维矩阵
  31.     % 3x3 Laplacian matrixes
  32.     regop = repmat(zeros(3),[1 1 3*ones(1,NSD-2)]);
  33.     % center matrix of Laplacian
  34.     idx = [{':'}, {':'}, repmat({2},[1 NSD-2])];
  35.     regop(idx{:}) = [0 1 0;1 -NSD*2 1;0 1 0];  % 模板算子
  36. end
  37. %   regop =
  38. %      0     1     0
  39. %      1    -4     1
  40. %      0     1     0
  41. % 改变REGOP折返回原始维数
  42. idx1 = repmat({1},[1 length(sizePSF)]);
  43. idx1(numNSdim) = repmat({':'},[1 NSD]);
  44. REGOP(idx1{:}) = regop;
  45. % 转化PSF函数到期望的维数 光传递函数OTF
  46. REGOP = psf2otf(REGOP,sizeI);

  47. fftnI = fftn(I);
  48. R2 = abs(REGOP).^2;
  49. H2 = abs(otf).^2;

  50. % 计算LAGRA值
  51. if (numel(LR)==1) || isequal(diff(LR),0),% LAGRA is given
  52.     LAGRA = LR(1);
  53. else % 采用fminbnd在[1e-9,1e9]优化,加速计算
  54.     R4G2 = (R2.*abs(fftnI)).^2;
  55.     H4 = H2.^2;
  56.     R4 = R2.^2;
  57.     H2R22 = 2*H2.*R2;
  58.     ScaledNP = NP*prod(sizeI);
  59.     LAGRA = fminbnd(@ResOffset,LR(1),LR(2),[],R4G2,H4,R4,H2R22,ScaledNP);
  60. end;

  61. % 重构图像
  62. Denom = H2 + LAGRA*R2;
  63. Nomin = conj(otf).*fftnI;

  64. % 保证Denom中的最小值取为sqrt(eps)
  65. Denom = max(Denom, sqrt(eps));
  66. J = real(ifftn(Nomin./Denom));   % 取实部
  67. end

  68. function f = ResOffset(LAGRA,R4G2,H4,R4,H2R22,ScaledNP)
  69. % 计算反向卷积残差-留数计算
  70. % Parseval's theorem
  71. Residuals = R4G2./(H4 + LAGRA*H2R22 + LAGRA^2*R4 + sqrt(eps));
  72. f = abs(LAGRA^2*sum(Residuals(:)) - ScaledNP);
  73. end
复制代码








算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-4-20 04:39 , Processed in 0.225684 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表