图像处理工具- scikit-image

scikit-image基本操作

  • 图像数据通过ndarray表示
  • 图像的像素值通常有以下两种处理范围
    • 1.0-255,0:黑,255:白
    • 2.0-1  ,0:黑,1:白
  • skimage支持以上两种像素范围,至于如何选择是根据数组的dtype决定

1.skimage的图像数据

import skimage
import numpy as np
import matplotlib.pyplot as plt

# 随机生成500x500的多维数组
random_image = np.random.random([500, 500])
#print(random_image)
plt.imshow(random_image, cmap='gray')
plt.colorbar()

from skimage import data
# 加载skimage中的coin数据
coins = data.coins()
print(type(coins), coins.dtype, coins.shape)
plt.imshow(coins, cmap='gray')
plt.colorbar()

cat = data.chelsea()
print("图片形状:", cat.shape)
print("最小值/最大值:", cat.min(), cat.max())
plt.imshow(cat)
plt.colorbar()

图片形状: (300, 451, 3)
最小值/最大值: 0 231

# 在图片上叠加一个红色方块
cat[10:110, 10:110, :] = [255, 0, 0]  # [red, green, blue]
plt.imshow(cat)

2.数据类型和像素值

# 生成0-1间的2500个数据
linear0 = np.linspace(0, 1, 2500).reshape((50, 50))

# 生成0-255间的2500个数据
linear1 = np.linspace(0, 255, 2500).reshape((50, 50)).astype(np.uint8)

print("Linear0:", linear0.dtype, linear0.min(), linear0.max())
print("Linear1:", linear1.dtype, linear1.min(), linear1.max())

fig, (ax0, ax1) = plt.subplots(1, 2)
ax0.imshow(linear0, cmap='gray')
ax1.imshow(linear1, cmap='gray')
answer:
Linear0: float64 0.0 1.0
Linear1: uint8 0 255

  • 像素值数据类型转换
    • img_as_float,img_as_ubyte
from skimage import img_as_float, img_as_ubyte

image = data.chelsea()

image_float = img_as_float(image) # 像素值范围:0-1
image_ubyte = img_as_ubyte(image) # 像素值范围:0-255

print("type, min, max:", image_float.dtype, image_float.min(), image_float.max())
print("type, min, max:", image_ubyte.dtype, image_ubyte.min(), image_ubyte.max())

print("231/255 =", 231/255.) # 验证0-255 转换到 0-1
answer:
type, min, max: float64 0.0 0.905882352941
type, min, max: uint8 0 231
231/255 = 0.9058823529411765

3.显示图像

  • 用过plt.inshow(),可以指定不同的color map
import matplotlib.pyplot as plt
import numpy as np
from skimage import data

image = data.camera()

fig, (ax_jet, ax_gray) = plt.subplots(ncols=2, figsize=(10, 5))

# 使用不同的color map
ax_jet.imshow(image, cmap='jet')
ax_gray.imshow(image, cmap='gray');

# 通过数组切片操作获取人脸区域
face = image[80:160, 200:280]
fig, (ax_jet, ax_gray) = plt.subplots(ncols=2)
ax_jet.imshow(face, cmap='jet')
ax_gray.imshow(face, cmap='gray')

4.图像I/O

  • 加载图像,skimage.io.imread()
  • 同时加载多个图像 skimage.io.imread_collection()
  • 保存.skimage.io.imsave()
from skimage import io
image = io.imread('1.jpg')

print(type(image))
plt.imshow(image)

# 同时加载多个图像
ic = io.imread_collection('*.png')

print(type(ic), '\n\n', ic)
answer:
<class 'skimage.io.collection.ImageCollection'> 

 ['1.png', '2.png', '3.png', '4.png', '5.png

f, axes = plt.subplots(nrows=1, ncols=len(ic), figsize=(15, 10))
for i, image in enumerate(ic):
    axes[i].imshow(image)
    axes[i].axis('off')

# 保存图像
saved_img = ic[0]
io.imsave('./output/python_analysis.png', saved_img)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值