summaryrefslogtreecommitdiff
path: root/dip/segmentation
diff options
context:
space:
mode:
Diffstat (limited to 'dip/segmentation')
-rw-r--r--dip/segmentation/grab_cut.py41
-rw-r--r--dip/segmentation/image_fusion.py53
-rw-r--r--dip/segmentation/result.jpgbin0 -> 9900 bytes
-rw-r--r--dip/segmentation/sample_dog.jpgbin0 -> 163759 bytes
-rw-r--r--dip/segmentation/sample_giraffe.jpgbin0 -> 382965 bytes
-rw-r--r--dip/segmentation/sample_person.jpgbin0 -> 113880 bytes
-rw-r--r--dip/segmentation/sample_scream.jpgbin0 -> 174515 bytes
7 files changed, 94 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()
diff --git a/dip/segmentation/image_fusion.py b/dip/segmentation/image_fusion.py
new file mode 100644
index 0000000..4ef0762
--- /dev/null
+++ b/dip/segmentation/image_fusion.py
@@ -0,0 +1,53 @@
+import cv2
+import numpy as np
+
+src = cv2.imread("sample_person.jpg")
+src = cv2.resize(src, (0, 0), fx=0.5, fy=0.5)
+r = cv2.selectROI('input', src, False) # 返回 (x_min, y_min, w, h)
+
+# roi区域
+roi = src[int(r[1]):int(r[1] + r[3]), int(r[0]):int(r[0] + r[2])]
+img = src.copy()
+cv2.rectangle(img, (int(r[0]), int(r[1])), (int(r[0]) + int(r[2]), int(r[1]) + int(r[3])), (255, 0, 0), 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)
+
+background = cv2.imread("sample_giraffe.jpg")
+
+h, w, ch = src.shape
+background = cv2.resize(background, (w, h))
+# cv.imwrite("background.jpg", background)
+
+# mask = np.zeros(src.shape[:2], dtype=np.uint8)
+bgdmodel = np.zeros((1, 65), np.float64)
+fgdmodel = np.zeros((1, 65), np.float64)
+
+cv2.grabCut(src, mask, rect, bgdmodel, fgdmodel, 5, mode=cv2.GC_INIT_WITH_RECT)
+mask2 = np.where((mask == 1) | (mask == 3), 255, 0).astype('uint8')
+
+# 高斯模糊,边缘变得光滑
+se = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
+cv2.dilate(mask2, se, mask2)
+mask2 = cv2.GaussianBlur(mask2, (5, 5), 0)
+cv2.imshow('background-mask', mask2)
+# cv.imwrite('background-mask.jpg', mask2)
+
+# 虚化背景
+# background = cv.GaussianBlur(background, (0, 0), 3)
+mask2 = mask2 / 255.0
+print('mask2 shape', mask2.shape)
+a = mask2[..., None]
+print('a shape', a.shape)
+
+# 融合方法 com = a*fg + (1-a)*bg
+result = a * (src.astype(np.float32)) + (1 - a) * (background.astype(np.float32))
+# result = cv2.bitwise_and(background.astype(np.uint8), background.astype(np.uint8), mask=mask2)
+
+cv2.imshow("result", result.astype(np.uint8))
+cv2.imwrite("result.jpg", result.astype(np.uint8))
+
+cv2.waitKey(0)
+cv2.destroyAllWindows()
diff --git a/dip/segmentation/result.jpg b/dip/segmentation/result.jpg
new file mode 100644
index 0000000..07dbf44
--- /dev/null
+++ b/dip/segmentation/result.jpg
Binary files differ
diff --git a/dip/segmentation/sample_dog.jpg b/dip/segmentation/sample_dog.jpg
new file mode 100644
index 0000000..77b0381
--- /dev/null
+++ b/dip/segmentation/sample_dog.jpg
Binary files differ
diff --git a/dip/segmentation/sample_giraffe.jpg b/dip/segmentation/sample_giraffe.jpg
new file mode 100644
index 0000000..a93e8b8
--- /dev/null
+++ b/dip/segmentation/sample_giraffe.jpg
Binary files differ
diff --git a/dip/segmentation/sample_person.jpg b/dip/segmentation/sample_person.jpg
new file mode 100644
index 0000000..61d377f
--- /dev/null
+++ b/dip/segmentation/sample_person.jpg
Binary files differ
diff --git a/dip/segmentation/sample_scream.jpg b/dip/segmentation/sample_scream.jpg
new file mode 100644
index 0000000..43f2c36
--- /dev/null
+++ b/dip/segmentation/sample_scream.jpg
Binary files differ