Python抠图黑背景
时间: 2023-11-29 10:44:41 浏览: 86
以下是Python使用OpenCV进行抠图的代码,其中使用了GrabCut算法,可以实现黑色背景的抠图效果:
```python
import cv2
import numpy as np
# 读取图片
img = cv2.imread('input.jpg')
# 创建与图像相同大小的掩膜
mask = np.zeros(img.shape[:2], np.uint8)
# 创建以0填充的前景和背景模型
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)
# 创建一个新的掩膜图像,其中确定的前景和可能的前景被标记为1,其他区域被标记为0
mask2 = np.where((mask==2)|(mask==0), 0, 1).astype('uint8')
# 将原始图像与掩膜相乘,得到抠图结果
img = img*mask2[:,:,np.newaxis]
# 将抠图结果保存到文件
cv2.imwrite('output.png', img)
```
相关问题
python 复杂抠图
在Python中,可以使用许多库进行图像处理和抠图,其中最常用的是OpenCV和Pillow。
使用OpenCV进行抠图的步骤如下:
1. 读取图片并转换为灰度图像
```python
import cv2
img = cv2.imread("image.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
```
2. 对图像进行二值化处理,将背景变为黑色
```python
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
```
3. 进行形态学操作,填充目标区域,使其连通
```python
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=2)
```
4. 找到目标区域的轮廓,并用最小矩形框将其框起来
```python
contours, hierarchy = cv2.findContours(closing, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
rect = cv2.minAreaRect(contour)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(img, [box], 0, (0, 0, 255), 2)
```
5. 将目标区域外的部分涂为白色,即抠图完成
```python
mask = np.zeros_like(img)
cv2.drawContours(mask, [box], 0, (255, 255, 255), -1)
result = np.bitwise_and(img, mask)
```
使用Pillow进行抠图的步骤如下:
1. 读取图片并将其转换为RGBA模式
```python
from PIL import Image
img = Image.open("image.png")
img = img.convert("RGBA")
```
2. 获取图像中每个像素的RGBA值,并将背景像素的alpha通道值设为0
```python
width, height = img.size
for x in range(width):
for y in range(height):
r, g, b, a = img.getpixel((x, y))
if r > 200 and g > 200 and b > 200:
a = 0
img.putpixel((x, y), (r, g, b, a))
```
3. 将抠出的图像保存到文件
```python
img.save("result.png")
```
Python 实现 人物抠图
人物抠图是一种常见的图像处理任务,可以使用Python中的OpenCV库来实现。下面是一个简单的示例代码:
```python
import cv2
# 加载图像
image = cv2.imread('input.jpg')
# 创建一个与输入图像相同大小的掩码(mask),将其初始化为全黑
mask = np.zeros(image.shape[:2], dtype=np.uint8)
# 定义前景和背景模型
bgdModel = np.zeros((1, 65), dtype=np.float64)
fgdModel = np.zeros((1, 65), dtype=np.float64)
# 定义矩形区域,包含要抠图的人物
rect = (x, y, w, h) # 根据实际情况修改坐标和宽高
# 使用GrabCut算法进行图像分割
cv2.grabCut(image, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)
# 创建一个掩码,将前景标记为可能的前景(可能是人物)
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')
# 将图像与掩码相乘,提取前景
result = image * mask2[:, :, np.newaxis]
# 显示结果
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
请注意,这只是一个简单的示例代码,实际应用中可能需要根据具体情况进行调整和优化。
阅读全文