实现效果
第一张图为原图,其余的图为分割后的图形
代码实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
# -*-coding:utf-8-*-
import numpy as np
import cv2
#----------------------------------------------------------------------
def obj_clip(img, foreground, border):
result = []
height ,width = np.shape(img)
visited = set ()
for h in range (height):
for w in range (width):
if img[h,w] = = foreground and not (h,w) in visited:
obj = visit(img, height, width, h, w, visited, foreground, border)
result.append(obj)
return result
#----------------------------------------------------------------------
def visit(img, height, width, h, w, visited, foreground, border):
visited.add((h,w))
result = [(h,w)]
if w > 0 and not (h, w - 1 ) in visited:
if img[h, w - 1 ] = = foreground:
result + = visit(img, height, width, h, w - 1 , visited , foreground, border)
elif border is not None and img[h, w - 1 ] = = border:
result.append((h, w - 1 ))
if w < width - 1 and not (h, w + 1 ) in visited:
if img[h, w + 1 ] = = foreground:
result + = visit(img, height, width, h, w + 1 , visited, foreground, border)
elif border is not None and img[h, w + 1 ] = = border:
result.append((h, w + 1 ))
if h > 0 and not (h - 1 , w) in visited:
if img[h - 1 , w] = = foreground:
result + = visit(img, height, width, h - 1 , w, visited, foreground, border)
elif border is not None and img[h - 1 , w] = = border:
result.append((h - 1 , w))
if h < height - 1 and not (h + 1 , w) in visited:
if img[h + 1 , w] = = foreground :
result + = visit(img, height, width, h + 1 , w, visited, foreground, border)
elif border is not None and img[h + 1 , w] = = border:
result.append((h + 1 , w))
return result
#----------------------------------------------------------------------
if __name__ = = "__main__" :
import cv2
import sys
sys.setrecursionlimit( 100000 )
img = np.zeros([ 400 , 400 ])
cv2.rectangle(img, ( 10 , 10 ), ( 150 , 150 ), 1.0 , 5 )
cv2.circle(img, ( 270 , 270 ), 70 , 1.0 , 5 )
cv2.line(img, ( 100 , 10 ), ( 100 , 150 ), 0.5 , 5 )
#cv2.putText(img, "Martin",(200,200), 1.0, 5)
cv2.imshow( "img" , img * 255 )
cv2.waitKey( 0 )
for obj in obj_clip(img, 1.0 , 0.5 ):
clip = np.zeros([ 400 , 400 ])
for h, w in obj:
clip[h, w] = 0.2
cv2.imshow( "aa" , clip * 255 )
cv2.waitKey( 0 )
|
总结
到此这篇关于python 使用递归的方式实现语义图片分割的文章就介绍到这了,更多相关python 语义图片分割内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/qq_38973721/article/details/107352151