目录

基于区域的图像分割方法

区域生长法

算法步骤

区域分裂与合并

阈值分割

区域合并

实现区域生长法

代码

 分割结果


基于区域的图像分割方法

基于区域的分割是以直接寻找区域为基础的分割技术,实际上类似基于边界的图像分割技术一样利用了对象与背景灰度分布的相似性。

基于区域的图像分割方法可以分为四类:

  1. 区域生长法
  2. 区域分裂与合并
  3. 阈值分割
  4. 区域合并

区域生长法

区域生长的基本思想是将具有相似性质的像素集中起来构建成分割区域。以一组种子点开始,将与种子性质相似(如灰度级)的领域像素附加到生长区域的每个种子上

算法步骤

a.随机选取图像中的一个像素作为种子像素,并将其表示出来

b.检索种子附近的未被标记的像素点,如果他们的差值在所规定的阈值内(阈值需要根据不同的情况进行设置),则合并到分割区域中

c.重复b步骤,直到区域停止扩张,并在此时再次随机选择非选定区域的一个像素做为种子像素

d.重复上述步骤,直到图像中的每个像素均被分配到不同的区域中

种子产生的方法

根据所解决问题的性质选择一个或多个起点
若无先验信息,则对每个像素计算相同的特性集,特性集在生长过程中用于将像素归属于某个区域
若这些计算的结果呈现了不同簇的值,则簇中心附近的像素可以作为种子
 终止规则

若没有像素满足加入到某个区域的条件时,则区域停止生长,终止规则的制定需要先验知识或先验模型。

相似度准则

灰度级类似准则
纹理类似准则
颜色类似准则

区域分裂与合并

区域分裂与合并算法的基本思路类似于微分,即无穷分割,然后将分割后满足相似度准则的区域进行合并。

阈值分割

阈值分割主要运用于灰度图像的分割。如果一张灰度图中目标和背景之间的灰度值有差异,则可以通过阈值分割的方法把图中的目标和背景分开。如果只选取一个阈值的分割被称为单阈值分割,会将图像分割成目标和背景两部分;如果选取多个阈值的分割被称为多阈值分割,会将图形分割成多个区域。

区域合并

区域合并可以看做区域生长的逆向过程,从整个图像出发,不断分割出子区域

实现区域生长法

对图像进行分割,得到脑部的单独图像。

代码

from PIL import Image
import matplotlib.pyplot as plt  # plt 用于显示图片
import numpy as np

im = Image.open('D:/PICS/Marker.png')  # 读取图片
im_array = np.array(im)
print(im_array)
[m, n] = im_array.shape
a = np.zeros((m, n))  # 建立等大小空矩阵
a[100, 100] = 1  # 设立种子点
k = 40  # 设立区域判断生长阈值
flag = 1  # 设立是否判断的小红旗
while flag == 1:
	flag = 0
	lim = (np.cumsum(im_array * a)[-1]) / (np.cumsum(a)[-1])
	for i in range(2, m):
		for j in range(2, n):
			if a[i, j] == 1:
				for x in range(-1, 2):
					for y in range(-1, 2):
						if a[i + x, j + y] == 0:
							if (abs(im_array[i + x, j + y] - lim) <= k):
								flag = 1
								a[i + x, j + y] = 1

data = im_array * a  # 矩阵相乘获取生长图像的矩阵
new_im = Image.fromarray(data)  # data 矩阵转化为二维图片
# 画图展示
plt.subplot(1, 2, 1)
plt.imshow(im, cmap='gray')
plt.axis('off')  # 不显示坐标轴
# plt.show()
plt.subplot(1, 2, 2)
plt.imshow(new_im, cmap='gray')
plt.axis('off')  # 不显示坐标轴
plt.show()

 分割结果

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐