summaryrefslogtreecommitdiff
path: root/dip/segmentation/grab_cut.py
diff options
context:
space:
mode:
authorzhang <zch921005@126.com>2020-03-28 20:32:36 +0800
committerzhang <zch921005@126.com>2020-03-28 20:32:36 +0800
commit71e4aa85367ef9af880204f13029211f16ff4f80 (patch)
treec2272a20b4144cf5e4828c97092db3ba0213b9af /dip/segmentation/grab_cut.py
parenta3563e0afb9db883c4a366592ff783a42a3eb78d (diff)
数字图像处理行人检测与前景背景分割
Diffstat (limited to 'dip/segmentation/grab_cut.py')
-rw-r--r--dip/segmentation/grab_cut.py41
1 files changed, 41 insertions, 0 deletions
diff --git a/dip/segmentation/grab_cut.py b/dip/segmentation/grab_cut.py
new file mode 100644
index 0000000..363496b
--- /dev/null
+++ b/dip/segmentation/grab_cut.py
@@ -0,0 +1,41 @@
+import cv2
+import numpy as np
+
+src = cv2.imread("sample_person.jpg")
+src = cv2.resize(src, (0, 0), fx=0.5, fy=0.5)
+
+# 交互式,返回 (x_min, y_min, w, h)
+r = cv2.selectROI('input', src, True)
+
+# roi区域
+roi = src[int(r[1]):int(r[1] + r[3]), int(r[0]):int(r[0] + r[2])]
+
+# 原图mask,与原图等大小
+mask = np.zeros(src.shape[:2], dtype=np.uint8)
+
+# 矩形roi
+rect = (int(r[0]), int(r[1]), int(r[2]), int(r[3])) # 包括前景的矩形,格式为(x,y,w,h)
+
+# bg模型的临时数组
+bgdmodel = np.zeros((1, 65), np.float64)
+# fg模型的临时数组
+fgdmodel = np.zeros((1, 65), np.float64)
+
+cv2.grabCut(src, mask, rect, bgdmodel, fgdmodel, 11, mode=cv2.GC_INIT_WITH_RECT)
+
+print(np.unique(mask))
+# 提取前景和可能的前景区域
+mask2 = np.where((mask == 1) | (mask == 3), 255, 0).astype('uint8')
+
+print(mask2.shape)
+
+# 按位与 src & src == 0,得到的是二进制
+result = cv2.bitwise_and(src, src, mask=mask2)
+# cv2.imwrite('result.jpg', result)
+# cv2.imwrite('roi.jpg', roi)
+
+cv2.imshow('mask', mask2)
+cv2.imshow('roi', roi)
+cv2.imshow("result", result)
+cv2.waitKey(0)
+cv2.destroyAllWindows()