# -*- 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()
【圖像處理4】區域生長算法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.