python 可设置分割距离的八领域分割代码
以下是Python中可设置分割距离的八领域分割代码:
import numpy as np
import cv2
def get_8_neighborhood(x, y, shape):
"""
获取元素(x, y)的8领域坐标
"""
neighbors = []
for i in range(-1, 2):
for j in range(-1, 2):
if i == 0 and j == 0:
continue
if x + i < 0 or x + i >= shape[0] or y + j < 0 or y + j >= shape[1]:
continue
neighbors.append((x + i, y + j))
return neighbors
def segment_img(img, threshold):
"""
对图像进行八领域分割
"""
# 定义标记矩阵
labeled = np.zeros_like(img)
label = 1
# 遍历像素
for i in range(img.shape[0]):
for j in range(img.shape[1]):
# 如果当前像素已经被标记过,则跳过
if labeled[i, j] != 0:
continue
# 获取当前像素的8领域
neighbors = get_8_neighborhood(i, j, img.shape)
# 遍历8领域像素
for neighbor in neighbors:
# 如果8领域像素的灰度值与当前像素的灰度值之差小于阈值,则将它们标记为同一类别
if abs(int(img[i, j]) - int(img[neighbor[0], neighbor[1]])) < threshold:
labeled[i, j] = label
labeled[neighbor[0], neighbor[1]] = label
# 对当前类别的所有像素进行扩展,直到不能再扩展为止
while True:
# 获取当前类别的所有像素
labeled_pixels = np.argwhere(labeled == label)
# 遍历当前类别的所有像素
for labeled_pixel in labeled_pixels:
# 获取当前像素的8领域
labeled_neighbors = get_8_neighborhood(labeled_pixel[0], labeled_pixel[1], labeled.shape)
# 遍历8领域像素
for labeled_neighbor in labeled_neighbors:
# 如果8领域像素的灰度值与当前像素的灰度值之差小于阈值,并且8领域像素没有被标记,则将它们标记为同一类别
if abs(int(img[labeled_pixel[0], labeled_pixel[1]]) - int(img[labeled_neighbor[0], labeled_neighbor[1]])) < threshold and labeled[labeled_neighbor[0], labeled_neighbor[1]] == 0:
labeled[labeled_neighbor[0], labeled_neighbor[1]] = label
# 如果当前类别的像素数量没有变化,则退出扩展循环
if len(np.argwhere(labeled == label)) == len(labeled_pixels):
break
# 当前类别扩展结束,将类别编号加1
label += 1
return labeled
# 读取图像
img = cv2.imread('test.jpg', cv2.IMREAD_GRAYSCALE)
# 进行八领域分割,设置阈值为20
labeled = segment_img(img, 20)
# 可视化结果
cv2.imshow('original', img)
cv2.imshow('segmented', labeled*50)
cv2.waitKey(0)
cv2.destroyAllWindows()
在该代码中,get_8_neighborhood函数用于获取元素(x, y)的8领域坐标;segment_img函数用于对图像进行八领域分割,其中threshold参数用于设置分割的阈值;最后的可视化结果中,图像中的每个类别用不同的灰度值表示。
原文地址: https://www.cveoy.top/t/topic/bJC0 著作权归作者所有。请勿转载和采集!