1.网址链接
https://scipy.org/https://scipy.org/
2.图像模糊
2.1 运行代码
from PIL import Image
from numpy import *
from scipy.ndimage import gaussian_filter
import matplotlib.pyplot as plt
img = array(Image.open(r"C:\Users\cgs\Desktop\pictures\1 (11).jpg").convert('L'))
img2 = gaussian_filter(img, 2)
img3 = gaussian_filter(img, 5)
img4 = gaussian_filter(img, 10)
# 创建一个 2x2 的图像网格
fig, axs = plt.subplots(2, 2, figsize=(10, 10))
# 显示原始图像
axs[0, 0].imshow(img, cmap='gray')
axs[0, 0].set_title('Original Image')
axs[0, 0].axis('off')
# 显示应用高斯滤波后的图像
axs[0, 1].imshow(img2, cmap='gray')
axs[0, 1].set_title('Gaussian Filter (sigma=2)')
axs[0, 1].axis('off')
axs[1, 0].imshow(img3, cmap='gray')
axs[1, 0].set_title('Gaussian Filter (sigma=5)')
axs[1, 0].axis('off')
axs[1, 1].imshow(img4, cmap='gray')
axs[1, 1].set_title('Gaussian Filter (sigma=10)')
axs[1, 1].axis('off')
# 显示所有图像
plt.tight_layout()
plt.show()
2.2显示图像
scipy.ndimage文档查看链接
3.图像导数
3.1 Sobel导数滤波器
3.1.1 运行代码
from PIL import Image
from numpy import *
from scipy.ndimage import sobel, filters
import matplotlib.pyplot as plt
img = array(Image.open(r"C:\Users\cgs\Desktop\pictures\3 (1).jpg").convert('L'))
# sobel导数滤波器
imgx = zeros(img.shape)
filters.sobel(img, 1, imgx)
imgy = zeros(img.shape)
filters.sobel(img, 0, imgy)
# 计算梯度大小
magnitude = sqrt(imgx**2+imgy**2)
# 创建一个2x2的网络图像
fig, axs = plt.subplots(2, 2, figsize=(10, 10))
# 显示原始图像
axs[0, 0].imshow(img, cmap='gray')
axs[0, 0].set_title('Original Image')
axs[0, 0].axis('off')
# 显示x导数图像
axs[0, 1].imshow(imgx, cmap='gray')
axs[0, 1].set_title('x_grad')
axs[0, 1].axis('off')
# 显示y导数图像
axs[1, 0].imshow(imgy, cmap='gray')
axs[1, 0].set_title('y_grad')
axs[1, 0].axis('off')
# 显示梯度大小图像
axs[1, 1].imshow(magnitude, cmap='gray')
axs[1, 1].set_title('grad')
axs[1, 1].axis('off')
plt.tight_layout
plt.show()
3.1.2 运行结果
3.2 图像导数结合高斯导数
3.2.1 运行代码(sigma=5)
from PIL import Image
from numpy import *
from scipy.ndimage import sobel, filters
import matplotlib.pyplot as plt
img = array(Image.open(r"C:\Users\cgs\Desktop\pictures\3 (1).jpg").convert('L'))
# 标准差
sigma = 5
# sobel导数滤波器
imgx = zeros(img.shape)
filters.sobel(img, 1, imgx)
filters.gaussian_filter(img, (sigma, sigma), (0, 1), imgx) # 改变的
imgy = zeros(img.shape)
filters.sobel(img, 0, imgy)
filters.gaussian_filter(img, (sigma, sigma), (0, 1), imgy) # 改变的
# 计算梯度大小
magnitude = sqrt(imgx**2+imgy**2)
# 创建一个2x2的网络图像
fig, axs = plt.subplots(2, 2, figsize=(10, 10))
# 显示原始图像
axs[0, 0].imshow(img, cmap='gray')
axs[0, 0].set_title('Original Image')
axs[0, 0].axis('off')
# 显示x导数图像
axs[0, 1].imshow(imgx, cmap='gray')
axs[0, 1].set_title('x_grad')
axs[0, 1].axis('off')
# 显示y导数图像
axs[1, 0].imshow(imgy, cmap='gray')
axs[1, 0].set_title('y_grad')
axs[1, 0].axis('off')
# 显示梯度大小图像
axs[1, 1].imshow(magnitude, cmap='gray')
axs[1, 1].set_title('grad')
axs[1, 1].axis('off')
plt.tight_layout
plt.show()
3.2.2 图像显示
大家可以自行修改sigma的值查看结果图像
4. 形态学:对象计数
4.1.1 运行代码
from PIL import Image
from numpy import *
from scipy.ndimage import sobel, filters
import matplotlib.pyplot as plt
from scipy.ndimage import measurements, morphology
# 载入图像, 然后使用阈值化操作, 以保证处理的图像为二值图像
img= array(Image.open(r"C:\Users\cgs\Desktop\pictures\1 (16).jpg").convert('L'))
img = 1 * (img < 128)
lables, nbr_objects = measurements.label(img)
print("Number of objects:", nbr_objects)
4.1.2 显示结果
Number of objects: 2618
4.2.1 一些对象间有连接, 进行开操作
from PIL import Image
from numpy import *
from scipy.ndimage import sobel, filters
import matplotlib.pyplot as plt
from scipy.ndimage import measurements, morphology
# 载入图像, 然后使用阈值化操作, 以保证处理的图像为二值图像
img= array(Image.open(r"C:\Users\cgs\Desktop\pictures\1 (16).jpg").convert('L'))
img = 1 * (img < 128)
# 形态学开操作更好的分离各个对象
# 使用布尔数组作为结构元素
structure = ones((9, 5), dtype=bool) # 创建布尔类型的结构元素
img_open = morphology.binary_opening(img, structure, iterations=2)
labels_open, nbr_objects_open = measurements.label(img_open)
print("Number of objects:", nbr_objects_open)
4.2.2 运行结果
5. 一些有用的Scipy模块
Input and output (scipy.io) — SciPy v1.14.0 Manualhttps://docs.scipy.org/doc/scipy/reference/io.html
5.1 以图像形式保存数组
from PIL import Image
from numpy import *
import numpy as np
import imageio
# 创建一个示例数组 (例如 100x100 的灰度图像)
array = np.random.rand(100, 100) * 255 # 生成一个随机的灰度图像
array = array.astype(np.uint8) # 将数组数据类型转换为 uint8
print(array)
# 保存图像
output_path = r"C:\Users\cgs\Desktop\pictures\1 (16).jpg"
imageio.imwrite(output_path, array)
# 打开图像
image = Image.open(output_path)
# 定义新尺寸 (宽度, 高度)
new_size = (200, 200) # 例如,调整到 200x200 像素
# 调整图像大小
resized_image = image.resize(new_size)
# 显示调整后的图像
resized_image.show()
5.2 运行图片
查看图像数组