1.二值图像进行区域分割
import numpy as np
import matplotlib.pyplot as plt
from skimage import data, io
from skimage.filters import threshold_local
from skimage.morphology import binary_opening, binary_closing, disk
from skimage import img_as_ubyte
image = data.coins()
plt.imshow(image, cmap='gray', vmin=0, vmax=255)
局部二值化
print(image.shape) # (303, 384)
th = threshold_local(image, block_size=125, offset=-15) #局部二值化阈值
# 二值化处理
mask0 = image > th
plt.imshow(mask0, cmap='gray')
plt.show()
closing处理
mask1 = binary_closing(mask0, disk(3)) # <-disk(1)填不满
plt.imshow(mask1, cmap='gray')
plt.axis('off')
plt.show()
opening处理
mask2 = binary_opening(mask1, disk(3))
plt.imshow(mask2, cmap='gray')
plt.axis('off')
plt.show()
masked = image*mask2
plt.imshow(masked, cmap='gray')
plt.axis('off')
plt.show()
2.Label
from skimage.measure import label
from skimage.color import label2rgb
label_img = label(mask2)
c_label_img = label2rgb(label_img, bg_label=0, image=image) #領域ごとに適当に色をつけて表示
plt.figure(figsize=(10,4))
plt.subplot(121)
plt.imshow(label_img)
plt.axis('off')
plt.colorbar()
plt.subplot(122)
plt.imshow(c_label_img)
plt.axis('off')
plt.show()
抽出7号硬币
mask3 = np.zeros(label_img.shape)
mask3[label_img==7]=1
plt.figure(figsize=(10,4))
plt.subplot(121)
plt.imshow(mask3, cmap='gray')
plt.subplot(122)
plt.imshow(image*mask3, cmap='gray')
plt.show()
3.特征提取 regionprops
(1)面积,亮度
from skimage.measure import regionprops
props = regionprops(label_img, intensity_image=image)
areas = [] #面积
means = [] #硬币的平均亮度
for prop in props:
if prop['area']>500: #面积500以上
y1, x1, y2, x2 = prop['bbox'] #外接矩形的坐标
plt.imshow(image[y1:y2,x1:x2],cmap='gray')
plt.show()
print("ID:", prop['label']) #lebel号
print("面积:", prop['area']) #面积
print("平均亮度:", prop['mean_intensity']) #平均亮度
print("周长:", prop['perimeter']) #周长(単位为像素)
areas.append(prop['area'])
means.append(prop['mean_intensity'])
plt.scatter(areas, means)
plt.xlabel("Area")
plt.ylabel("Mean Intensity")
plt.show()
(2)所有特征量
for item in props[0]:
print(item, ":", prop[item])
# area : 1464
# area_bbox : 1886
# area_convex : 1500
# area_filled : 1464
# axis_major_length : 45.320677849714
# axis_minor_length : 41.148342391948304
# bbox : (248, 336, 289, 382)
# centroid : (268.0075136612022, 358.1448087431694)
# centroid_local : [20.00751366 22.14480874]
# centroid_weighted : (267.9509544384042, 358.0799674180582)
# centroid_weighted_local : [19.95095444 22.07996742]
# coords : [[248 354]
# [248 355]
# [248 356]
# ...
# [288 361]
# [288 362]
# [288 363]]
# eccentricity : 0.4191056170704604
# equivalent_diameter_area : 43.17432910297829
# euler_number : 1
# extent : 0.7762460233297985
# feret_diameter_max : 46.87216658103186
# image : [[False False False ... False False False]
# [False False False ... False False False]
# [False False False ... False False False]
# ...
# [False False False ... False False False]
# [False False False ... False False False]
# [False False False ... False False False]]
# image_convex : [[False False False ... False False False]
# [False False False ... False False False]
# [False False False ... False False False]
# ...
# [False False False ... False False False]
# [False False False ... False False False]
# [False False False ... False False False]]
# image_filled : [[False False False ... False False False]
# [False False False ... False False False]
# [False False False ... False False False]
# ...
# [False False False ... False False False]
# [False False False ... False False False]
# [False False False ... False False False]]
# image_intensity : [[0 0 0 ... 0 0 0]
# [0 0 0 ... 0 0 0]
# [0 0 0 ... 0 0 0]
# ...
# [0 0 0 ... 0 0 0]
# [0 0 0 ... 0 0 0]
# [0 0 0 ... 0 0 0]]
# inertia_tensor : [[1.28372473e+02 7.75907761e-02]
# [7.75907761e-02 1.05824397e+02]]
# inertia_tensor_eigvals : [128.37274004734735, 105.82413010031311]
# intensity_max : 214.0
# intensity_mean : 154.29781420765028
# intensity_min : 77.0
# label : 24
# moments : [[1.46400000e+03 3.24200000e+04 9.05872000e+05 2.83783940e+07]
# [2.92910000e+04 6.48530000e+05 1.81086080e+07 5.66984330e+08]
# [7.40967000e+05 1.64094240e+07 4.51511658e+08 1.39022544e+10]
# [2.10321410e+07 4.65826844e+08 1.26060977e+10 3.80602543e+11]]
# moments_central : [[ 1.46400000e+03 -2.35900188e-12 1.87937301e+05 -5.63933841e+03]
# [ 3.67705866e-12 -1.13592896e+02 -1.06074294e+04 7.50381781e+04]
# [ 1.54926917e+05 5.39692284e+03 1.33022875e+07 1.27460882e+05]
# [ 7.82879427e+03 -1.13419012e+05 -2.08187942e+06 -1.65495983e+07]]
# moments_hu : [ 1.59970540e-01 2.37223328e-04 3.04639425e-07 1.15677975e-09
# -2.10816335e-17 -1.75684355e-11 -5.20826290e-18]
# moments_normalized : [[ nan nan 8.76861155e-02 -6.87662695e-05]
# [ nan -5.29991640e-05 -1.29347327e-04 2.39143759e-05]
# [ 7.22844242e-02 6.58102465e-05 4.23938735e-03 1.06165437e-06]
# [ 9.54645630e-05 -3.61461987e-05 -1.73405075e-05 -3.60265893e-06]]
# moments_weighted : [[2.25892000e+05 4.98768800e+06 1.38932782e+08 4.33358566e+09]
# [4.50676100e+06 9.97437860e+07 2.78354830e+09 8.69601199e+10]
# [1.13345767e+08 2.51326943e+09 6.92456647e+10 2.13172404e+12]
# [3.20261718e+09 7.10839231e+10 1.92812715e+12 5.82844892e+13]]
# moments_weighted_central : [[ 2.25892000e+05 -5.32253353e-10 2.88047935e+07 -6.06344440e+06]
# [ 2.08956408e-10 2.34649959e+05 1.34456542e+06 6.86928200e+07]
# [ 2.34315836e+07 1.23560438e+06 1.99961371e+09 3.00734819e+08]
# [ 6.29603118e+06 1.60850955e+07 3.86165186e+08 4.53452447e+09]]
# moments_weighted_hu : [ 1.02369680e-03 1.11728663e-08 1.70997792e-13 1.38882458e-13
# -2.12784146e-26 -7.43233122e-18 2.30216331e-27]
# moments_weighted_normalized : [[ nan nan 5.64498854e-04 -2.50015695e-07]
# [ nan 4.59852743e-06 5.54408411e-08 5.95948586e-09]
# [ 4.59197950e-04 5.09480203e-08 1.73477660e-07 5.48947405e-11]
# [ 2.59606011e-07 1.39547189e-09 7.04888039e-11 1.74151952e-12]]
# orientation : -1.5673552548724272
# perimeter : 141.29646455628165
# perimeter_crofton : 136.63896538976286
# slice : (slice(248, 289, None), slice(336, 382, None))
# solidity : 0.976