python opencv提取轮廓与抠图
时间: 2023-07-27 11:03:07 浏览: 360
Python中的OpenCV库是一个广泛使用的计算机视觉库,提供了许多图像处理和分析的功能。其中包括轮廓提取和抠图的功能。
在OpenCV中,可以使用函数`findContours()`来提取图像中的轮廓。该函数接受一个二值化图像作为输入,并返回一个包含所有轮廓点的列表。具体步骤如下:
1. 将图像进行二值化处理,使得背景为黑色(像素值为0),感兴趣的对象为白色(像素值为255)。
2. 使用`findContours()`函数提取轮廓。该函数会修改输入图像,所以需要首先对输入图像进行备份。
3. `findContours()`函数返回两个值:轮廓点的列表和层级信息。我们只需要轮廓点的列表,可以使用索引0来获取。
4. 可以通过绘制轮廓来查看或显示轮廓,使用`drawContours()`函数可以实现该功能。
抠图是将感兴趣的对象从图像中分离出来形成一个新的图像。可以使用OpenCV中的函数`bitwise_and()`来实现抠图。具体步骤如下:
1. 选择一个感兴趣的对象,并使用函数`findContours()`提取其轮廓。
2. 创建一个与原图像尺寸相同的空白图像(全黑)作为抠图结果。
3. 使用函数`drawContours()`将感兴趣的对象轮廓绘制到空白图像上。
4. 使用`bitwise_and()`函数将原图像和抠图结果进行按位与操作,将背景部分变为黑色。可以使用反色操作将背景变为白色。
5. 得到的结果即为抠图后的图像。
总而言之,Python中的OpenCV库提供了丰富的图像处理功能,使用其提供的函数可以轻松实现图像的轮廓提取和抠图操作。
相关问题
python opencv轮廓检测,抠图
### 使用 Python 和 OpenCV 实现轮廓检测与抠图
#### 轮廓检测基础原理
在计算机视觉领域,轮廓是指具有相同颜色或强度的边界点所组成的曲线。通过查找这些边界可以识别物体形状并用于后续分析。
对于图像中的目标对象提取,通常先应用边缘检测技术来获取二值化后的边缘信息,再基于此寻找闭合区域即为所需轮廓[^1]。
#### 图像预处理阶段
为了提高最终效果,在执行上述过程前往往还需要做些准备工作:
- **灰度转换**:彩色图片转成单通道灰度形式以便简化计算;
- **噪声去除**:利用高斯模糊等方式减少不必要的细节干扰;
- **调整大小**:当源文件分辨率过高时可适当缩小尺寸以加快速度[^2]。
```python
import numpy as np
import cv2
def preprocess_image(image_path):
img = cv2.imread(image_path)
# 将图像缩放至合适大小
resized_img = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
gray = cv2.cvtColor(resized_img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
return blurred
```
#### 执行边缘检测
采用 Scharr 算子能够更精确捕捉到方向上的变化情况,从而获得更好的边缘特征表达。之后通过对 X、Y 方向的结果取绝对值得到正负边沿都可见的形式,并加权求和合成完整的边缘响应图谱。
```python
def detect_edges(preprocessed_img):
scharrx = cv2.Scharr(preprocessed_img, cv2.CV_64F, 1, 0)
scharry = cv2.Scharr(preprocessed_img, cv2.CV_64F, 0, 1)
abs_scharrx = cv2.convertScaleAbs(scharrx)
abs_scharry = cv2.convertScaleAbs(scharry)
edges = cv2.addWeighted(abs_scharrx, 0.5, abs_scharry, 0.5, 0)
_, binary_edges = cv2.threshold(edges, 30, 255, cv2.THRESH_BINARY)
return binary_edges
```
#### 寻找并绘制轮廓
一旦有了清晰定义好的边缘映射,则可以通过 `findContours` 函数轻松定位所有封闭图形的位置及其层次结构关系。接着就可以按照面积筛选出感兴趣的对象范围,并填充对应的颜色完成抠图工作[^3]。
```python
def extract_contours(edge_detected_img, original_img):
contours, _ = cv2.findContours(
edge_detected_img.copy(),
cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE
)
mask = np.zeros_like(original_img)
for cnt in contours:
area = cv2.contourArea(cnt)
if area > 500: # 只保留较大面积的目标
cv2.drawContours(mask, [cnt], -1, color=(255, 255, 255), thickness=-1)
result = cv2.bitwise_and(original_img, mask)
return result
```
opencv python 如何抠图
在OpenCV Python中,抠图通常是指从一张图像中分离出特定目标的过程,也称为二值化、轮廓检测或物体分割。以下是一个简单的步骤说明:
1. **读取图片**:首先,使用`cv2.imread()`函数加载需要处理的图片。
```python
import cv2
image = cv2.imread('image.jpg')
```
2. **预处理**:这一步可以包括调整图片亮度对比度、平滑(如高斯模糊)、去噪等操作。例如,通过`cv2.cvtColor()`进行颜色空间转换到灰度或二值化:
```python
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_, thresholded_image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 自动阈值二值化
```
3. **边缘检测**:使用OpenCV的轮廓检测算法,如`cv2.findContours()`来找到目标边缘:
```python
contours, _ = cv2.findContours(thresholded_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
```
4. **选择并提取轮廓**:遍历轮廓列表,选择感兴趣的轮廓,并用它们填充一个新掩码或返回原图的一部分:
```python
for contour in contours:
x,y,w,h = cv2.boundingRect(contour)
masked_image = image[y:y+h, x:x+w]
```
5. **结果保存**:最后,你可以保存这个抠图区域到新的文件中:
```python
cv2.imwrite('result.png', masked_image)
```
阅读全文
相关推荐
















