本文实现Matlab函数psf2otf()重写为python版本,亲测有效

def psf2otf(psf,size):import numpy as npif not(0 in psf):#Pad the PSF to outsizepsf=np.double(psf)psfsize=np.shape(psf)psfsize=np.array(psfsize)padsize=size-psfsizepsf=np.lib.pad(psf,((0,padsize[0]),(0,padsize[1])),'constant')#Circularly shift otf so that the "center" of the PSF is at the (1,1) element of the array.psf=np.roll(psf,-np.array(np.floor(psfsize/2),'i'),axis=(0,1))#Compute the OTFotf=np.fft.fftn(psf,axes=(0,1))#Estimate the rough number of operations involved in the computation of the FFT.nElem=np.prod(psfsize,axis=0)nOps=0for k in range(0,np.ndim(psf)):nffts=nElem/psfsize[k]nOps=nOps+psfsize[k]*np.log2(psfsize[k])*nfftsmx1=(abs(np.imag(otf[:])).max(0)).max(0)mx2=(abs(otf[:]).max(0)).max(0)eps= 2.2204e-16if mx1/mx2<=nOps*eps:otf=np.real(otf)else:otf=np.zeros(size)return otf

下面为使用样例(图像平滑):

MATLAB版:

function S = L0Smoothing(Im, lambda, kappa)if ~exist('kappa','var')kappa = 2.0;
end
if ~exist('lambda','var')lambda = 2e-2;
end
S = im2double(Im);
betamax = 1e5;
fx = [1, -1];
fy = [1; -1];
[N,M,D] = size(Im);
sizeI2D = [N,M];
otfFx = psf2otf(fx,sizeI2D);
otfFy = psf2otf(fy,sizeI2D);
Normin1 = fft2(S);
Denormin2 = abs(otfFx).^2 + abs(otfFy ).^2;
if D>1Denormin2 = repmat(Denormin2,[1,1,D]);
end
beta = 2*lambda;
while beta < betamaxDenormin   = 1 + beta*Denormin2;% h-v subproblemh = [diff(S,1,2), S(:,1,:) - S(:,end,:)];v = [diff(S,1,1); S(1,:,:) - S(end,:,:)];if D==1t = (h.^2+v.^2)<lambda/beta;elset = sum((h.^2+v.^2),3)<lambda/beta;t = repmat(t,[1,1,D]);endh(t)=0; v(t)=0;% S subproblemNormin2 = [h(:,end,:) - h(:, 1,:), -diff(h,1,2)];Normin2 = Normin2 + [v(end,:,:) - v(1, :,:); -diff(v,1,1)];FS = (Normin1 + beta*fft2(Normin2))./Denormin;S = real(ifft2(FS));beta = beta*kappa;fprintf('.');
end
fprintf('\n');
end

Python版本:

def psf2otf(psf,size):import numpy as npif not(0 in psf):#Pad the PSF to outsizepsf=np.double(psf)psfsize=np.shape(psf)psfsize=np.array(psfsize)padsize=size-psfsizepsf=np.lib.pad(psf,((0,padsize[0]),(0,padsize[1])),'constant')#Circularly shift otf so that the "center" of the PSF is at the (1,1) element of the array.psf=np.roll(psf,-np.array(np.floor(psfsize/2),'i'),axis=(0,1))#Compute the OTFotf=np.fft.fftn(psf,axes=(0,1))#Estimate the rough number of operations involved in the computation of the FFT.nElem=np.prod(psfsize,axis=0)nOps=0for k in range(0,np.ndim(psf)):nffts=nElem/psfsize[k]nOps=nOps+psfsize[k]*np.log2(psfsize[k])*nfftsmx1=(abs(np.imag(otf[:])).max(0)).max(0)mx2=(abs(otf[:]).max(0)).max(0)eps= 2.2204e-16if mx1/mx2<=nOps*eps:otf=np.real(otf)else:otf=np.zeros(size)return otfdef L0Smoothing(Im,lamda=2e-2,kappa=2.0):import numpy as npS=Im/255betamax=1e5fx=np.array([[1,-1]])fy=np.array([[1],[-1]])N,M,D=np.shape(Im)sizeI2D=np.array([N,M])otfFx=psf2otf(fx,sizeI2D)otfFy=psf2otf(fy,sizeI2D)Normin1=np.fft.fft2(S,axes=(0,1))Denormin2=abs(otfFx)**2+abs(otfFy)**2if D>1:D2=np.zeros((N,M,D),dtype=np.double)for i in range(D):D2[:,:,i]=Denormin2Denormin2=D2beta=lamda*2while beta<betamax:Denormin=1+beta*Denormin2#h-v subproblemh1=np.diff(S,1,1)h2=np.reshape(S[:,0],(N,1,3))-np.reshape(S[:,-1],(N,1,3))h=np.hstack((h1,h2))v1=np.diff(S,1,0)v2=np.reshape(S[0,:],(1,M,3))-np.reshape(S[-1,:],(1,M,3))v=np.vstack((v1,v2))if D==1:t=(h**2+v**2)<lamda/betaelse:t=np.sum((h**2+v**2),2)<lamda/betat1=np.zeros((N,M,D),dtype=np.bool)for i in range(D):t1[:,:,i]=tt=t1h[t]=0v[t]=0#S subproblemNormin2=np.hstack((np.reshape(h[:,-1],(N,1,3))-np.reshape(h[:,0],(N,1,3)),-np.diff(h,1,1)))Normin2=Normin2+np.vstack((np.reshape(v[-1,:],(1,M,3))-np.reshape(v[0,:],(1,M,3)),-np.diff(v,1,0)))FS=(Normin1+beta*np.fft.fft2(Normin2,axes=(0,1)))/DenorminS=np.real(np.fft.ifft2(FS,axes=(0,1)))beta*=kappaprint('.')print('\n')return Sdef main():import PILimport numpy as npimport pylabIm=np.array(PIL.Image.open("文件名"),'d')S=L0Smoothing(Im,0.01)pylab.imshow(S)main()

该代码的处理效果:

Matlab函数psf2otf()的python实现相关推荐

  1. python调用matlab函数_从python调用MATLAB函数

    我知道这是一个老问题,已经得到答复. 但是我一直在寻找相同的东西(对于Mac),发现有很多选择与matlab交互的方法和成熟度不同. 这是我发现的: pymat 使用matlab引擎(libeng)进 ...

  2. python调用matlab函数_从 Python 调用 MATLAB 函数的三种方法

    0. 实验环境Ubuntu 16.04 Matlab R2015b 1. 借助于 mlab 库 安装方法非常简单,只需一行命令 sudo pip install mlab 即可. import num ...

  3. 【已解决】Matlab函数imfilter在Python中的对应

    更新于2020/11/30,记录Matlab中的imfilter函数在Python下的对应函数. 文章目录 Conv 核尺寸为n×n时 核尺寸为n×1时 核尺寸为1×n时 Corr 首先给出结论: M ...

  4. 2021-01-28 粒子群优化算法-Python版本和Matlab函数 particleswarm 调用

    粒子群优化算法-Python版本和Matlab函数 particleswarm 调用 前两天分享了粒子群优化算法的原理和Matlab原理实现,本文分享一下Python代码下的PSO实现以及Matlab ...

  5. matlab代码重改python代码,对应函数

    (2021)matlab代码重改python代码,对应函数--全!_Troublemaker丶的博客-CSDN博客

  6. 一文读懂如何用python调用matlab函数(windows环境)

    第一步配置环境: 要安装引擎 API,请在操作系统提示符下执行以下命令,其中 matlabroot 是 MATLAB 文件夹的路径.您可能需要管理员权限才能执行这些命令.或者,使用在非默认位置安装用于 ...

  7. 关于python文件中调用matlab函数的打包问题

    1.首先说明python如何调用matlab函数的? 这里我参考的是这篇文章:(3条消息) pythonGUI调用matlab并打包成可执行文件的解决方法_白金之星1717的博客-CSDN博客_pyt ...

  8. Python实现MATLAB函数regionprops(BW, ‘Extrema‘)功能

    Python实现MATLAB函数regionprops(BW, 'Extrema')功能 Python软件包skimage中的measure.regionprops()与MATLAB函数regionp ...

  9. 全面对比 MATLAB、Julia、Python,谁在科学计算中更胜一筹?

    数百种编程语言,各有优劣,各自也都有自己最为适用的场景.那么就科学计算领域而言,主流的 MATLAB.Julia.Python 会有哪些最为独特的优势呢?又存在哪些让开发者无力的缺陷?在本文中,我们将 ...

  10. 转载:如何将一个新函数加到MATLAB函数库中

    如何将一个新函数加到MATLAB函数库中 nkszjx2 2017-09-29 11:25:26 13864 收藏 2 分类专栏: matlab 文章标签: matlab 库 </div> ...

最新文章

  1. 单链表中一个插入操作的分析
  2. mysql数据库链接百分号_数据库百分号怎么用
  3. 快速弄懂内存字节对齐
  4. oracle 月份期差,Oracle Database 日期算术-日期之间的月份或年份之间的差异
  5. Linux 系统中的定时任务及延时任务
  6. 面向切面编程应用_应用面向方面的编程
  7. 《深入理解Elasticsearch(原书第2版)》一2.3.3 把查询模板保存到文件
  8. QString 字符编码
  9. bay trail android 平板,英特尔再推9款平板专用BayTrail-T处理器
  10. linux 常用指令汇总
  11. linux mint php mysql_Installing LAMP (Linux, Apache, MySQL and PHP) On Linux Mint
  12. 写java一般用什么系统字体_JavaSE中使用非系统自带的字体
  13. Centos7.4安装Mysql5.6
  14. Week 10. 第189-204题
  15. 苹果在中国失掉 iPad 商标
  16. 保存网页html 有什么,保存网页时HTML和MHTML区别在哪里
  17. 用C处理字符串:键盘输入“yes”,则输出“ok”;输入其他字符,则输出“Thank you”;
  18. python小游戏井字棋(人机对战)
  19. Linux平台上文件同步——rsync+inotify之定时同步
  20. 制作坦克大战,坦克移动代码

热门文章

  1. 什么是运算计算机科学的基础概念,【软件设计师】笔记一:计算机科学基础知识...
  2. Canvas动画案例演示,含动画猫、变幻线、代码雨等
  3. 读《春秋》有感之十二:偪阳之战
  4. 图像处理之颜色检测分类标记(Python OpenCV实现)
  5. DirextX Training笔记
  6. 【opencv】18.数字图像一阶导数、二阶导数的数学原理
  7. PS制作火焰效果文字的方法步骤教程
  8. CapsNet ——胶囊网络原理
  9. 大学生应该读什么书——一位年轻老师给他的年轻学生的一封回信
  10. canvas画不规则图形