面向对象的水体提取代码
时间: 2023-11-20 17:11:02 浏览: 38
这里提供一个比较简单的面向对象的水体提取代码示例:
```python
import numpy as np
import cv2
class WaterExtractor:
def __init__(self, kernel_size=15, threshold=127):
self.kernel_size = kernel_size
self.threshold = threshold
def extract_water(self, image):
# 转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 高斯滤波
blur = cv2.GaussianBlur(gray, (self.kernel_size, self.kernel_size), 0)
# 二值化
ret, thresh = cv2.threshold(blur, self.threshold, 255, cv2.THRESH_BINARY)
# 膨胀操作
kernel = np.ones((5,5),np.uint8)
dilate = cv2.dilate(thresh,kernel,iterations = 1)
# 查找轮廓
contours, hierarchy = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 找到最大的轮廓
max_area = 0
max_contour = None
for contour in contours:
area = cv2.contourArea(contour)
if area > max_area:
max_area = area
max_contour = contour
# 创建掩模
mask = np.zeros_like(gray)
cv2.drawContours(mask, [max_contour], 0, 255, -1)
# 应用掩模
water = cv2.bitwise_and(image, image, mask=mask)
return water
```
上述代码中,我们定义了一个名为 `WaterExtractor` 的类,它包含了一个初始化方法 `__init__` 和一个提取水体的方法 `extract_water`。
在初始化方法中,我们定义了两个参数 `kernel_size` 和 `threshold`,分别表示高斯滤波器和二值化操作的参数。默认值分别为 15 和 127。
在提取水体的方法中,我们首先将输入图像转换为灰度图像,然后使用高斯滤波器和二值化操作来得到一个二值化的图像,接着进行膨胀操作来填充水体区域。最后,我们使用轮廓检测来找到最大的轮廓,并创建一个掩模来将水体区域提取出来。
使用该类可以很方便地提取水体区域,例如:
```python
# 读取图像
image = cv2.imread('water.jpg')
# 创建 WaterExtractor 对象
we = WaterExtractor(kernel_size=15, threshold=127)
# 提取水体
water = we.extract_water(image)
# 显示结果
cv2.imshow('water', water)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
其中,`water.jpg` 是一张包含水体的图像。