六、 图像分割
6.2区域生长
6.2.1区域生长的基本概念:可以理解成先选择一个像素区域,然后将其邻接区域中相似程度高的像素合并进去,直到找不到可以合并的像素为止。其的主要优点是能够较为精准地将具有相同特征的联通区域分割出来。
6.2.2相似性判断的主要依据:设定一个阙值,计算每个候选像素的灰度值与已生长区域像素的平均灰度值之间的差的绝对值,要是这个值小于阙值,则认为相似程度高,将其合并到生长区域像素中去,反之则不进行合并。
6.3.3实际应用:
import cv2
import numpy as np
def region_growing(img, seed, threshold):
"""
区域生长算法实现。
参数:
img: 输入图像,NumPy数组。
seed: 种子点,格式为(x, y)。
threshold: 生长阈值,决定相邻像素是否加入区域。
返回:
一个NumPy数组,表示区域生长的结果。
"""
rows, cols = img.shape
region = np.zeros((rows, cols), dtype=np.uint8)
seeds = [seed]
region[seed[0], seed[1]] = 255
neighbors = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]
while seeds:
x, y = seeds.pop(0)
for nx, ny in neighbors:
nx, ny = x + nx, y + ny
if 0 <= nx < rows and 0 <= ny < cols and region[nx, ny] == 0:
# 确保像素值被转换为整数进行比较
if abs(int(img[nx, ny]) - int(img[x, y])) < threshold:
region[nx, ny] = 255
seeds.append((nx, ny))
return region
# 加载图像
img_path = 'taiyang2.jpg' # 替换为你的图像路径
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) # 以灰度模式读取图像
# 检查图像是否成功加载
if img is None:
print("错误:无法加载图像。请检查文件路径。")
else:
# 种子点和阈值
seed = (100, 100) # 替换为你的种子点坐标
threshold = 20 # 替换为你的阈值
# 执行区域生长算法
result = region_growing(img, seed, threshold)
# 缩小图像
img_small = cv2.resize(img, (0, 0), fx=0.5, fy=0.5)
result_small = cv2.resize(result, (0, 0), fx=0.5, fy=0.5)
# 拼接图像
concat_img = cv2.hconcat([img_small, result_small])
# 显示结果
cv2.imshow('Region Growing Comparison', concat_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
注:本人为在校学生,博客是边学边写的,主要是为了巩固知识,如有错误请积极指正。
本文的内容主要基于我对张运楚教授编著的《数字图像处理》一书的学习和理解。这本书深入浅出地介绍了数字图像处理的基本理论以及经典算法等,并且提供了丰富的示例代码和实际用例,极大地帮助了我学习图像处理知识。在此,我推荐大家阅读这本书,更加深入的学习有关图像处理的知识