在本篇学习笔记中,我们将探索图像处理的基本概念和技术。从最初的图像读取、尺寸获取,到颜色通道分离,再到更高级的图像灰度化、二值化、边缘检测和高斯滤波,每一步都配有直观的代码示例和结果展示。通过操作真实的图像数据—这里以一张猫和一张狗的图像为例—我们不仅会学习如何使用Python和skimage
库进行图像处理,还将了解到各种技术如何帮助我们提取图像信息、减少噪声并突出重要特征。
原始图像:
首先导入需要的库,然后用io.imread读取图片,获取基本信息 (高度,宽度,颜色通道)。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from skimage import io
from skimage.color import rgb2gray
from skimage.filters import threshold_otsu
from skimage.filters import sobel
from skimage.filters import gaussian
cat = io.imread('cat_image.png')
dog = io.imread('dog_image.png')
df = pd.DataFrame(['Cat','Dog'], columns=['Image'])
print(cat.shape, dog.shape)
#(高度,宽度,颜色通道):(234, 313, 3) (234, 406, 3)#
# 组合图片
fig = plt.figure(figsize=(8,4)) # 创建一个图形实例,并设置图形的尺寸(宽度8英寸,高度4英寸)
ax1 = fig.add_subplot(1,2,1) # 参数(1,2,1)表示创建一个1行2列的子图网格,并将此子图放在第1个位置,下面同理
ax1.imshow(cat)
ax2 = fig.add_subplot(1,2,2)
ax2.imshow(dog) # 图片:猫和狗
# 分离图片的颜色通道
dog_r = dog.copy()
dog_r[:,:,1] = dog_r[:,:,2] = 0 # 只保留红色通道
dog_g = dog.copy()
dog_g[:,:,0] = dog_g[:,:,2] = 0 # 只保留绿色通道
dog_b = dog.copy()
dog_b[:,:,0] = dog_b[:,:,1] = 0 # 只保留蓝色通道
plot_image = np.concatenate((dog_r, dog_g, dog_b), axis=1)
plt.figure(figsize = (10,5))
plt.imshow(plot_image) # 图片:三色狗
# 图像灰度化
dog_gray = rgb2gray(dog)
plt.figure(figsize=(10,7))
plt.imshow(dog_gray, cmap='gray') # 显示灰度图像
# 图像二值化
thresh = threshold_otsu(dog_gray)
dog_binary = dog_gray > thresh
plt.figure(figsize=(10,7))
plt.imshow(dog_binary, cmap='gray') # 显示二值化图像
# 边缘检测
dog_edges = sobel(dog_gray)
plt.figure(figsize=(10,7))
plt.imshow(dog_edges, cmap='gray') # 显示边缘检测结果
# 图像滤波
dog_smooth = gaussian(dog_gray, sigma=3) # 高斯核的标准差,控制滤波的程度。sigma值越大,图像的平滑效果越明显,但同时也可能导致图像细节的丢失
plt.figure(figsize=(10,7))
plt.imshow(dog_smooth, cmap='gray') # 显示滤波后的图像