Scipy基础

1.网址链接

https://scipy.org/icon-default.png?t=N7T8https://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文档查看链接

https://docs.scipy.org/doc/scipy/reference/ndimage.html#icon-default.png?t=N7T8https://docs.scipy.org/doc/scipy/reference/ndimage.html#

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 Manualicon-default.png?t=N7T8https://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 运行图片

查看图像数组

5.3 查看文件夹确实被保存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值