用python写一个基于区域生长的图像分割的代码
时间: 2024-04-29 08:26:42 浏览: 90
好的,以下是一个基于区域生长的图像分割的Python代码示例:
```python
import cv2
import numpy as np
# 设置种子点
def on_mouse(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
seed = (y, x)
fill(seed)
# 区域生长
def fill(seed):
global image, mask
h, w = image.shape[:2]
mask = np.zeros((h+2, w+2), dtype=np.uint8)
lo = 0
hi = 0
q = []
q.append(seed)
while q:
n = q.pop(0)
if mask[n[0]+1, n[1]+1] == 0 and check(image[n[0], n[1]], image[seed[0], seed[1]]):
mask[n[0]+1, n[1]+1] = 255
lo = min(lo, n[1])
hi = max(hi, n[1])
if n[0] > 0:
q.append((n[0]-1, n[1]))
if n[0] < h-1:
q.append((n[0]+1, n[1]))
if n[1] > 0:
q.append((n[0], n[1]-1))
if n[1] < w-1:
q.append((n[0], n[1]+1))
for i in range(h):
for j in range(lo, hi+1):
if mask[i+1, j+1] > 0:
image[i, j] = (0, 0, 255)
cv2.imshow('image', image)
# 判断是否为同一区域
def check(c1, c2):
diff = np.abs(np.int32(c1) - np.int32(c2))
if diff[0] + diff[1] + diff[2] < 30:
return True
else:
return False
# 加载图像
image = cv2.imread('test.jpg')
cv2.namedWindow('image')
cv2.setMouseCallback('image', on_mouse)
# 显示图像
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这个代码使用的是OpenCV库,通过鼠标点击设置种子点,然后进行区域生长,最后将分割出的区域用红色标记出来。你可以根据实际需要进行修改和优化。
阅读全文