mirror of
https://github.com/wassname/scikit-image.git
synced 2026-08-12 12:30:16 +08:00
compare bilateral
This commit is contained in:
@@ -1,9 +1,23 @@
|
||||
"""
|
||||
==============================
|
||||
Simplified bilateral filtering
|
||||
Bilateral mean
|
||||
==============================
|
||||
This example compares
|
||||
|
||||
to complete
|
||||
* local mean
|
||||
* percentile mean
|
||||
* bilateral mean
|
||||
|
||||
build on the local histogram distribution
|
||||
local mean uses all pixels belonging to the structuring element to compute average gray level,
|
||||
percentile mean uses only values between percentiles p0 and p1 (here 10% and 90%),
|
||||
whereas bilateral mean uses only pixels of the structuring element having a gray level situated inside
|
||||
g-s0 and g+s1 (here g-500 and g+500).
|
||||
The filters are applied on a 16 bit image (actual bitdepth is 12bit).
|
||||
|
||||
Percentile and usual mean give here similar results, these filters smooth the complete image (background and details).
|
||||
Bilateral mean exhibits a high filtering rate for continuous area (i.e. background) while image higher frequencies
|
||||
remains untouched.
|
||||
|
||||
"""
|
||||
import numpy as np
|
||||
@@ -13,23 +27,21 @@ from skimage import data
|
||||
from skimage.morphology import disk
|
||||
import skimage.filter.rank as rank
|
||||
|
||||
a8 = (data.coins()).astype('uint8')
|
||||
|
||||
a16 = (data.coins()).astype('uint16')*16
|
||||
selem = np.ones((20,20),dtype='uint8')
|
||||
f1 = rank.percentile_mean(a8,selem = selem,p0=.1,p1=.9)
|
||||
selem = disk(20)
|
||||
|
||||
f1 = rank.percentile_mean(a16,selem = selem,p0=.1,p1=.9)
|
||||
f2 = rank.bilateral_mean(a16,selem = selem,s0=500,s1=500)
|
||||
selem = disk(50)
|
||||
f3 = rank.equalize(a16,selem = selem)
|
||||
f3 = rank.mean(a16,selem = selem)
|
||||
|
||||
# display results
|
||||
fig, axes = plt.subplots(nrows=3, figsize=(15,15))
|
||||
fig, axes = plt.subplots(nrows=3, figsize=(15,10))
|
||||
ax0, ax1, ax2 = axes
|
||||
|
||||
ax0.imshow(np.hstack((a8,f1)))
|
||||
ax0.imshow(np.hstack((a16,f1)))
|
||||
ax0.set_title('percentile mean')
|
||||
ax1.imshow(np.hstack((a16,f2)))
|
||||
ax1.set_title('bilateral mean')
|
||||
ax2.imshow(np.hstack((a16,f3)))
|
||||
ax2.set_title('local equalization')
|
||||
ax2.set_title('local mean')
|
||||
plt.show()
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
"""
|
||||
====================================================
|
||||
Bilateral comparison
|
||||
====================================================
|
||||
|
||||
In this example, we compare both bilateral implementation
|
||||
|
||||
* filter.denoise_bilateral
|
||||
* filter.rank.bilateral_mean
|
||||
|
||||
The first filter implements a spatial-gaussian and spectral-gaussian kernel bilateral filter whereas the latter implements
|
||||
a cylindrical kernel bilateral filter i.e. spatial-flat and spectral-flat kernel.
|
||||
|
||||
The timing comparison is just for information since the kernel are not the same.
|
||||
|
||||
"""
|
||||
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
from skimage import data
|
||||
from skimage.filter._denoise import denoise_bilateral
|
||||
from skimage.filter.rank import bilateral_mean
|
||||
from skimage.morphology import disk
|
||||
from skimage.filter import denoise_bilateral
|
||||
import time
|
||||
|
||||
def exec_and_timeit(func):
|
||||
""" Decorator that returns both function results and execution time
|
||||
(result, ms)
|
||||
"""
|
||||
def wrapper(*arg):
|
||||
t1 = time.time()
|
||||
res = func(*arg)
|
||||
t2 = time.time()
|
||||
ms = (t2-t1)*1000.0
|
||||
return (res,ms)
|
||||
return wrapper
|
||||
|
||||
|
||||
@exec_and_timeit
|
||||
def den_bil(image):
|
||||
return denoise_bilateral(a8,win_size=20,sigma_range=255,sigma_spatial=1)[:,:,0]*255
|
||||
|
||||
@exec_and_timeit
|
||||
def rank_bil(image):
|
||||
return bilateral_mean(a8.astype(np.uint16),disk(20),s0=10,s1=10)
|
||||
|
||||
a8 = data.camera()
|
||||
selem = disk(10)
|
||||
|
||||
f1,t1 = den_bil(a8)
|
||||
f2,t2 = rank_bil(a8)
|
||||
|
||||
# display results
|
||||
fig, axes = plt.subplots(nrows=2, figsize=(15,10))
|
||||
ax0, ax1= axes
|
||||
|
||||
ax0.imshow(np.hstack((f1,a8-f1)))
|
||||
ax0.set_title('denoise bilateral (%f ms)'%t1)
|
||||
ax1.imshow(np.hstack((f2,a8-f1)))
|
||||
ax1.set_title('bilateral mean (%f ms)'%t2)
|
||||
plt.show()
|
||||
Reference in New Issue
Block a user