针对图片eight.tif,先利用中值滤波去噪,然后用阈值方法进行分割,利用形态学滤波进行填充孔洞,得到分割结果;对分割结果实现区域标记,用不同的颜色显示不同区域
时间: 2024-02-05 16:13:24 浏览: 103
1111867.rar_中值滤波_中值滤波去噪_图像去噪 自适应_自适应中值滤波_自适应去噪
好的,这是一道比较完整的图像处理任务,我会尽力解答。
首先需要读取图片 eight.tif 并显示出来,这可以使用 Python 的 Pillow 库来实现。
```python
from PIL import Image
img = Image.open('eight.tif')
img.show()
```
接下来可以使用中值滤波进行去噪,这可以使用 Python 的 OpenCV 库来实现。
```python
import cv2
img = cv2.imread('eight.tif')
img_median = cv2.medianBlur(img, 3)
cv2.imshow('Median Filter', img_median)
cv2.waitKey(0)
```
这里使用了 3x3 的中值滤波器,可以根据具体情况进行调整。
然后可以使用阈值方法进行分割,这里使用 Otsu 阈值法,也可以使用其他的阈值方法。
```python
img_gray = cv2.cvtColor(img_median, cv2.COLOR_BGR2GRAY)
ret, img_otsu = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imshow('Otsu Threshold', img_otsu)
cv2.waitKey(0)
```
接下来可以使用形态学滤波进行填充孔洞,这里使用闭运算来填充孔洞。
```python
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
img_close = cv2.morphologyEx(img_otsu, cv2.MORPH_CLOSE, kernel)
cv2.imshow('Closing', img_close)
cv2.waitKey(0)
```
最后可以使用连通区域分析来进行区域标记,这里使用 OpenCV 的 connectedComponentsWithStats 函数来实现。
```python
output = cv2.connectedComponentsWithStats(img_close, 4, cv2.CV_32S)
num_labels = output[0]
labels = output[1]
stats = output[2]
# 随机生成颜色
colors = [tuple(np.random.randint(0, 255, 3).tolist()) for _ in range(num_labels)]
colors[0] = (0, 0, 0) # 背景色为黑色
# 用不同颜色显示不同区域
img_color = np.zeros((img.shape[0], img.shape[1], 3), dtype=np.uint8)
for i in range(num_labels):
img_color[labels == i] = colors[i]
cv2.imshow('Regions', img_color)
cv2.waitKey(0)
```
完整代码如下:
```python
import cv2
import numpy as np
from PIL import Image
img = Image.open('eight.tif')
img.show()
img = cv2.imread('eight.tif')
img_median = cv2.medianBlur(img, 3)
cv2.imshow('Median Filter', img_median)
cv2.waitKey(0)
img_gray = cv2.cvtColor(img_median, cv2.COLOR_BGR2GRAY)
ret, img_otsu = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imshow('Otsu Threshold', img_otsu)
cv2.waitKey(0)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
img_close = cv2.morphologyEx(img_otsu, cv2.MORPH_CLOSE, kernel)
cv2.imshow('Closing', img_close)
cv2.waitKey(0)
output = cv2.connectedComponentsWithStats(img_close, 4, cv2.CV_32S)
num_labels = output[0]
labels = output[1]
stats = output[2]
colors = [tuple(np.random.randint(0, 255, 3).tolist()) for _ in range(num_labels)]
colors[0] = (0, 0, 0) # 背景色为黑色
img_color = np.zeros((img.shape[0], img.shape[1], 3), dtype=np.uint8)
for i in range(num_labels):
img_color[labels == i] = colors[i]
cv2.imshow('Regions', img_color)
cv2.waitKey(0)
```
阅读全文