1.读取图像
import numpy as np
import matplotlib.pyplot as plt
from skimage import data, filters, io
from skimage.util import random_noise
# 读取硬币图像
coins = data.coins()
plt.imshow(coins, vmin=0, vmax=255, cmap='gray')
plt.colorbar()
print(coins.dtype, coins.shape) # uint8 (303, 384)
裁剪其中一枚
coin = coins[10:80, 300:370]
plt.imshow(coin, vmin=0, vmax=255, cmap='gray')
plt.colorbar()
print(coin.dtype, coin.shape) # uint8 (70, 70)
给图像加入噪音(加入噪音正则化后为0-1的float64)
noisy = random_noise(coin, var=0.01) # 噪音强度0.01
plt.imshow(noisy, cmap='gray')
plt.colorbar()
print(noisy.dtype, noisy.shape) # float64 (70, 70)
2.去除噪音
常用的去噪方法:
Gaussian变换
plt.figure(figsize=(8,8))
for i, s in enumerate(np.arange(0, 2, 0.5)): #(0.0, 0.5, 1.0, 1.5)
plt.subplot(2,2,i+1)
plt.imshow(filters.gaussian(noisy, s), cmap='gray', vmin=0, vmax=1) # s-标准偏差,值越大取越大范围内的平均值
plt.title("s=%.1f"%s)
plt.axis('off')
plt.show()
方法对比:
from skimage.restoration import denoise_tv_chambolle, denoise_bilateral
from skimage import img_as_float
fig, ax = plt.subplots(nrows=2, ncols=3, figsize=(12, 8), sharex=True, sharey=True, subplot_kw={'adjustable': 'box'})
plt.gray()
ax[0, 0].imshow(noisy)
ax[0, 0].axis('off')
ax[0, 0].set_title('-Noisy-')
ax[0, 1].imshow(filters.gaussian(noisy,1))
ax[0, 1].axis('off')
ax[0, 1].set_title('Gaussian')
ax[0, 2].imshow(filters.median(noisy))
ax[0, 2].axis('off')
ax[0, 2].set_title('Median')
ax[1, 0].imshow(coin)
ax[1, 0].axis('off')
ax[1, 0].set_title('-Original-')
ax[1, 1].imshow(denoise_tv_chambolle(noisy, weight=0.1))
ax[1, 1].axis('off')
ax[1, 1].set_title('TV')
ax[1, 2].imshow(denoise_bilateral(noisy, sigma_color=0.5, sigma_spatial=1))
ax[1, 2].axis('off')
ax[1, 2].set_title('Bilateral')
fig.tight_layout()
plt.show()
3.边缘检测
sobel_h 水平方向
sobel_v 垂直方向
from skimage.filters import sobel, sobel_h, sobel_v
img = io.imread('Images/zebra.jpg', as_gray=True)
edge_sobel = sobel(img)
edge_sobelH = sobel_h(img)
edge_sobelV = sobel_v(img)
imglist = [img, edge_sobelH, edge_sobelV, edge_sobel]
titles = ['Original image','Horisontal Sobel','Vertical Sobel','Sobel edge']
cmaps = [plt.cm.gray, plt.cm.bwr, plt.cm.bwr, plt.cm.gray]
plt.figure(figsize=(12, 10))
for i in range(4):
plt.subplot(3,2,i+1)
plt.imshow(imglist[i], cmap=cmaps[i])
plt.title(titles[i])
plt.colorbar()
plt.axis('off')
plt.show()
from skimage import feature
edges1 = feature.canny(img)
edges2 = feature.canny(img, sigma=3) # sigma调节
plt.figure(figsize=(12, 8))
plt.gray()
plt.subplot(221)
plt.imshow(img)
plt.colorbar()
plt.axis('off')
plt.subplot(223)
plt.imshow(edges1)
plt.axis('off')
plt.subplot(224)
plt.imshow(edges2)
plt.axis('off')