In [1]:
from PIL import Image
from numpy import *
from pylab import *
In [2]:
import rof
In [3]:
im = array(Image.open('ceramic-houses_t0.png').convert('L'))
In [4]:
U, T = rof.denoise(im, im, tolerance=0.001)
t = 0.4
In [5]:
import scipy.misc
In [6]:
scipy.misc.imsave('result.pdf', U < t*U.max())
In [77]:
t = 0.4
binimage = 1*(U < t*U.max())
In [78]:
figure(figsize=(16, 8))
gray()
subplot(1, 3, 1)
imshow(im)
axis('off')
subplot(1, 3, 2)
imshow(U)
axis('off')
subplot(1, 3, 3)
imshow(binimage)
axis('off')
show()
In [79]:
from scipy.ndimage import filters
In [100]:
def cal_energy(oimg, bimg, lmd):
imb = bimg.copy()
imb = 1-imb
imx = zeros(imb.shape)
filters.sobel(imb, 1, imx)
imy = zeros(imb.shape)
filters.sobel(imb, 0, imy)
im2 = sqrt(imx**2 + imy**2)
E_edge = sum(im2)
imb = 120.0*imb/255 + 40.0/255
img = 1.0*oimg.copy()/255
im3 = (img - imb)**2
E_body = sum(im3)
# figure()
# subplot(1, 2, 1)
# imshow(im2)
# axis('off')
# subplot(1, 2, 2)
# imshow(im3)
# axis('off')
# show()
#
# print E_edge, E_body
return 0.5*lmd*E_edge + E_body, E_edge, E_body
In [101]:
print cal_energy(im, binimage, 1)
In [102]:
l = 0.5
E_min = 1e10
t_opt = -1
for t in arange(0.2, 0.8, 0.05):
binimage = 1*(U < t*U.max())
E, Ee, Eb = cal_energy(im, binimage, l)
print 't=', t, ': E=', E
print 'Ee=', Ee, ', Eb=', Eb
if E<E_min:
E_min = E
t_opt = t
t = t_opt
binimage = 1*(U > t*U.max())
print 'best threshold = ', t_opt
figure(figsize=(16, 8))
gray()
subplot(1, 3, 1)
imshow(im)
axis('off')
subplot(1, 3, 2)
imshow(U)
axis('off')
subplot(1, 3, 3)
imshow(binimage)
axis('off')
show()
In [85]:
from pylab import *
In [86]:
figure()
hist(im.flatten(), 256)
show()
In [ ]: