L0 Smoothing 笔记(二)
来源:互联网 发布:豆人网络战争前线 编辑:程序博客网 时间:2024/06/05 15:35
本篇主要记录Image Smoothing via L0 Gradient Minimization这篇论文的MATLAB代码以及笔者改写的python代码。笔者初学python,若代码有不合理之处,还望读者指正。
(一)原文的MATLAB代码:
function S = L0Smoothing(Im, lambda, kappa)if ~exist('kappa','var') kappa = 2.0;endif ~exist('lambda','var') lambda = 2e-2;endS = 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>1 Denormin2 = repmat(Denormin2,[1,1,D]);endbeta = 2*lambda;while beta < betamax Denormin = 1 + beta*Denormin2; % h-v subproblem h = [diff(S,1,2), S(:,1,:) - S(:,end,:)]; v = [diff(S,1,1); S(1,:,:) - S(end,:,:)]; if D==1 t = (h.^2+v.^2)<lambda/beta; else t = sum((h.^2+v.^2),3)<lambda/beta; t = repmat(t,[1,1,D]); end h(t)=0; v(t)=0; % S subproblem Normin2 = [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('.');endfprintf('\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()
该代码的处理效果:
另外,看到的几个用其它代码编写的程序链接:
1、http://blog.csdn.net/panda1234lee/article/details/52825113
2、http://download.csdn.net/download/bluecol/9175395
阅读全文
0 0
- L0 Smoothing 笔记(二)
- L0 Smoothing 笔记(一)
- Image Smoothing Via L0 Gradient Minimization
- Image Smoothing via L0 Gradient Minimization
- L0、L1、L2范数与核范数(二)
- 论文笔记:Adaptive Run Length Smoothing
- 读“机器学习中的范数规则化之(一)L0、L1与L2范数”笔记
- L0、L1、L2范数学习笔记
- Median Smoothing(构造性算法)
- Codeforces 590A Median Smoothing(暴力)
- Codeforces #591 C Median Smoothing(思维)
- 平滑处理--拉普拉斯(Laplace Smoothing)
- 机器学习中的范数规则化之(一)和(二)L0、L1与L2范数、核范数
- 笔记︱范数正则化L0、L1、L2-岭回归&Lasso回归(稀疏与特征工程)
- 高斯平滑滤波器(Gaussian Smoothing Filter)
- Code Forces 590 A. Median Smoothing(机智)
- Codeforces Round #327 (Div. 2) C. Median Smoothing(规律)
- Single Variable Calcucus (Smoothing a Piecewise Function)
- 人工智能技术基础
- [最短路 && 主席树维护HASH] 51nod1863 Travel
- 扩展kmp入门---hd Best Reward 3613
- Android填坑之旅(第十三篇)教你一招搞定项目混淆配置
- swift之类的继承、父类方法重写、属性值监听
- L0 Smoothing 笔记(二)
- 深入浅出Java MVC(Model View Controller) ---- (JSP + servlet + javabean实例)
- 51 NOD 1279 扔盘子(单调栈)
- 基于51单片机的电子时钟
- Android studio 导入项目出现:Failed to crunch file
- Win7 Qt4.8.5+QtCreator2.8.0+mingw配置过程
- 股票庄家套路(转发)
- 秋招面试
- jmeter监控服务器性能配置