基本用法
import math
import matplotlib.pyplot as plt
from skimage.measure import label, regionprops, regionprops_table
from PIL import Image
import numpy as np
img = Image.open("C429.png")
img = np.array(img)
label_img = label(img)
regions = regionprops(label_img)
print(len(regions))
fig, ax = plt.subplots()
ax.imshow(img, cmap=plt.cm.gray)
for props in regions:
y0, x0 = props.centroid
orientation = props.orientation
x1 = x0 + math.cos(orientation) * 0.5 * props.minor_axis_length
y1 = y0 - math.sin(orientation) * 0.5 * props.minor_axis_length
x2 = x0 - math.sin(orientation) * 0.5 * props.major_axis_length
y2 = y0 - math.cos(orientation) * 0.5 * props.major_axis_length
ax.plot((x0, x1), (y0, y1), '-r', linewidth=1)
ax.plot((x0, x2), (y0, y2), '-r', linewidth=1)
ax.plot(x0, y0, '.g', markersize=5)
minr, minc, maxr, maxc = props.bbox
bx = (minc, maxc, maxc, minc, minc)
by = (minr, minr, maxr, maxr, minr)
ax.plot(bx, by, '-b', linewidth=2.5)
# ax.axis((0, 2048, 600, 2048))
plt.show()
plt.savefig("test.png")
单个图像处理
from skimage.measure import label, regionprops
from PIL import Image
import numpy as np
img = Image.open("C429.png")
img = np.array(img, dtype=np.uint16) # for cellpose mask format:uint16
label_img = label(img)
regions = regionprops(label_img)
print(len(regions))
for props in regions:
minr, minc, maxr, maxc = props.bbox
img[minr:maxr, minc:maxc][np.where(img[minr:maxr, minc:maxc] != 0)] = props.label
img = Image.fromarray(img)
img.save("test.png")
批量处理
from skimage.measure import label, regionprops
from PIL import Image
import numpy as np
import os
files = os.listdir("masks")
for file in files:
img = Image.open(os.path.join("masks", file))
img = np.array(img, dtype=np.uint16) # for cellpose mask format:uint16
label_img = label(img)
regions = regionprops(label_img)
print(len(regions))
for props in regions:
minr, minc, maxr, maxc = props.bbox
img[minr:maxr, minc:maxc][np.where(img[minr:maxr, minc:maxc] != 0)] = props.label
img = Image.fromarray(img)
img.save(os.path.join("D:\cell_segmentation\data\CellData\masks", file.split(".")[0]+"_masks.png"))
以上方法存在的问题
当两个矩形框有重合的部分,赋值时后面的值会把前面的值覆盖,造成赋值错误。
解决方法:根据regionprops得到连通区域的属性,找到连通区域的所有像素点,给像素点赋值。而不是给矩阵框中的像素点赋值。
连通区域属性:
正确的赋值方式
from skimage.measure import label, regionprops
from PIL import Image
import numpy as np
import os
files = os.listdir("masks")
for file in files:
img = Image.open(os.path.join("masks", file))
img = np.array(img, dtype=np.uint16) # for cellpose mask format:uint16
label_img = label(img)
regions = regionprops(label_img)
print(len(regions))
for props in regions:
minr, minc, maxr, maxc = props.bbox
# 为了得到像素点的x,y坐标
pixel_points = props.coords # (2704,2)
pixel_points = np.transpose(pixel_points, [1, 0]) # (2, 2704)
img[pixel_points[0], pixel_points[1]] = props.label
img = Image.fromarray(img)
img.save(os.path.join("masks", file.split(".")[0]+"_masks.png"))