【圖像處理4】區域生長算法

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
import cv2


"""
區域生長算法

前提: 
    
    生長規則可以是平均灰度、紋理和顏色等

算法:

1. 順序查找圖像,找到第一個未歸類的像素 (x0, y0)

2. 通過遍歷該像素的四領域集合,若滿足生長規則則併入區域集合;

3. 繼續尋找該區域集合的四領域知道無法繼續生長;

4. 重新回到步驟1,直到所有圖像像素都被分類

"""

path = '/XXXX/'
img  = cv2.imread(path + 'lena.jpg')

img_gray       = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
img_gray_array = np.array(img_gray)
img_gray_array = cv2.resize(img_gray_array, (128, 128), interpolation=cv2.INTER_LINEAR)

img_mask = np.zeros(img_gray_array.shape)

grow_dir = [(0, 1),(0, -1),(1, 0),(-1, 0)]

gray_threshod = 30

def grow(x, y, w, h):

    cur_list = [];

    cur_list.append((x, y, 0))

    img_mask[x, y] = 1

    while len(cur_list) > 0:

        is_new = False #是否本輪有新增生長點

        for i in range(len(cur_list)):

            if cur_list[i][2] == 1:

                continue

            else:

                cur_list[i] = (cur_list[i][0], cur_list[i][1], 1)

            for j in range(len(grow_dir)):

                x_new = cur_list[i][0] + grow_dir[j][0]
                y_new = cur_list[i][1] + grow_dir[j][1]

                
                if x_new > 0 and x_new < w -1 and y_new > 0 and y_new < h - 1\
                    and True != ((x_new, y_new) in cur_list)\
                    and img_mask[x_new, y_new] != 1\
                    and abs(img_gray_array[x,y] - img_gray_array[x_new, y_new]) < gray_threshod:

                    cur_list.append((x_new, y_new, 0))

                    img_mask[x_new, y_new] = 1

                    is_new = True

        if is_new == False:

            #print(len(cur_list))

            return cur_list



list_stack = []

width  = img_gray_array.shape[0]
heigth = img_gray_array.shape[1]

while np.sum(img_mask == 0) > 1:

    for i in range(width):

        for j in range(heigth):

            if img_mask[i, j] == 0:

                list_stack.append(grow(i, j, width, heigth))

tar_img = np.zeros(img_gray_array.shape)

for z in range(len(list_stack)):

    color = ((z+1)*10)%255

    for k in range(len(list_stack[z])):
        tar_img[list_stack[z][k][0]][list_stack[z][k][1]] = color


plt.imshow(tar_img, cmap='gray')
plt.show()





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章