已经得到图像中一个子图像的边缘坐标,想实现根据边缘坐标将图片分割成两个部分,一部份是原图像,一部分是边缘坐标围起来的子图像代码思路
时间: 2023-11-27 14:54:52 浏览: 68
可以使用 OpenCV 库中的 grabCut() 函数来实现根据边缘坐标将图片分割成两个部分的功能。具体代码思路如下:
1. 读入原始图像和边缘坐标信息。
```python
import cv2
import numpy as np
# 读入原始图像和边缘坐标信息
img = cv2.imread('image.jpg')
mask = np.zeros(img.shape[:2], np.uint8)
rect = (xmin, ymin, xmax-xmin, ymax-ymin)
```
2. 使用 grabCut() 函数对图像进行分割,得到前景掩码。
```python
# 使用 grabCut() 函数进行分割,得到前景掩码
bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)
```
3. 根据前景掩码将原始图像分割成两个部分。
```python
# 根据前景掩码将原始图像分割成两个部分
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')
img_fg = img * mask2[:, :, np.newaxis]
img_bg = img * (1 - mask2[:, :, np.newaxis])
```
其中,img_fg 为边缘坐标围起来的子图像,img_bg 为原始图像减去子图像后的剩余部分。
完整代码如下:
```python
import cv2
import numpy as np
# 读入原始图像和边缘坐标信息
img = cv2.imread('image.jpg')
mask = np.zeros(img.shape[:2], np.uint8)
rect = (xmin, ymin, xmax-xmin, ymax-ymin)
# 使用 grabCut() 函数进行分割,得到前景掩码
bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)
# 根据前景掩码将原始图像分割成两个部分
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')
img_fg = img * mask2[:, :, np.newaxis]
img_bg = img * (1 - mask2[:, :, np.newaxis])
# 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('Foreground Image', img_fg)
cv2.imshow('Background Image', img_bg)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
阅读全文