python opencv抠图的代码怎么实现?
时间: 2023-05-14 15:06:59 浏览: 163
可以使用 OpenCV 中的 grabCut 函数来实现抠图。以下是一个简单的 Python 代码示例:
```
import cv2
# 读取图像
img = cv2.imread('input.jpg')
# 创建一个掩码
mask = np.zeros(img.shape[:2], np.uint8)
# 定义前景和背景模型
bgdModel = np.zeros((1,65), np.float64)
fgdModel = np.zeros((1,65), np.float64)
# 定义矩形区域
rect = (50,50,450,290)
# 进行 grabCut
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 = img*mask2[:,:,np.newaxis]
# 保存结果
cv2.imwrite('output.png', img)
```
这段代码会将 `input.jpg` 中的矩形区域提取出来,并保存为 `output.png`。
相关问题
python opencv抠图代码
以下是一个基于OpenCV的简单抠图代码示例:
```python
import cv2
# 读取图片
img = cv2.imread('input.jpg')
# 将图片转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 阈值分割
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 闭操作,去除噪点
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# 轮廓检测
contours, hierarchy = cv2.findContours(closed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 找到最大轮廓并绘制
max_contour = max(contours, key=cv2.contourArea)
mask = cv2.drawContours(img, [max_contour], 0, (0, 255, 0), 2)
# 显示结果
cv2.imshow('mask', mask)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
注释解释:
- `cv2.imread('input.jpg')`:读取输入图像。
- `cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)`:将图像转换为灰度图。
- `cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)`:使用Otsu二值化方法进行阈值分割。
- `cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))`:创建一个3x3的矩形结构元素,用于闭操作。
- `cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)`:使用闭操作去除噪点。
- `cv2.findContours(closed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)`:进行轮廓检测。
- `max_contour = max(contours, key=cv2.contourArea)`:找到最大轮廓。
- `cv2.drawContours(img, [max_contour], 0, (0, 255, 0), 2)`:将最大轮廓绘制在原图上,并且使用绿色线条。
注意:此代码示例仅作为参考,实际应用可能需要更复杂的处理和优化。
python opencv mask 抠图代码
下面是使用 OpenCV 进行简单的图像抠图的 Python 代码示例:
```python
import cv2
# 读取原图
img = cv2.imread("input.jpg")
# 创建掩膜(黑白图像)
mask = cv2.imread("mask.jpg", cv2.IMREAD_GRAYSCALE)
# 使用掩膜进行抠图
result = cv2.bitwise_and(img, img, mask=mask)
# 显示结果
cv2.imshow("Result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
其中,`input.jpg` 为待抠图的原图,`mask.jpg` 为掩膜图像,即用于指定要保留的区域的黑白图像。抠图结果保存在 `result` 变量中,并通过 `cv2.imshow()` 函数显示出来。
需要注意的是,掩膜图像应与原图尺寸相同,且像素值为 0 的位置表示要抠掉的部分,像素值为 255 的位置表示要保留的部分。如果掩膜图像包含多个通道,则只使用第一个通道(即灰度值)。
阅读全文