Scikit-Image图像处理 (2)——图像前处理

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')

猜你喜欢

转载自blog.csdn.net/weixin_49828565/article/details/129723756