用python写一个代码,要求:将原始图像灰度化、平滑处理、形态学操作去噪,计算最小的5个连通域面积的平均值作为面积最小值,再计算每个连通域的面积与面积最小值的比值k,根据k<1.3、1.3≤k<2.3、k≥2.3三种类别分成三个图像并展示。
时间: 2024-09-11 09:12:27 浏览: 40
在Python中,我们可以使用PIL库进行图像处理,NumPy进行数值计算,以及OpenCV库进行形态学操作。以下是一个简单的示例代码:
```python
from PIL import Image, ImageFilter
import cv2
import numpy as np
# 1. 加载图像
img = Image.open('input_image.jpg') # 替换为你的图片路径
gray_img = img.convert('L') # 灰度化
smoothing = gray_img.filter(ImageFilter.GaussianBlur(radius=2)) # 平滑处理
# 2. 形态学操作去噪
kernel = np.ones((5,5),np.uint8) # 5x5的结构元素
opening = cv2.morphologyEx(smoothing, cv2.MORPH_OPEN, kernel)
# 3. 寻找最小的5个连通域
contours, _ = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
areas = [cv2.contourArea(c) for c in contours]
sorted_areas = sorted(areas)[:5] # 取前5小的区域面积
min_area = sum(sorted_areas) / len(sorted_areas) # 计算平均值
thresholds = (min_area * 1.3, min_area * 2.3) # 设置阈值范围
# 4. 根据面积比例分类
output_images = []
for area, contour in zip(sorted_areas, contours):
k = area / min_area
if k < 1.3:
cat_img = cv2.drawContours(img.copy(), [contour], -1, (0, 0, 255), 2) # 红色表示小于1.3的
output_images.append((cat_img, 'small'))
elif 1.3 <= k < 2.3:
cat_img = cv2.drawContours(img.copy(), [contour], -1, (0, 255, 0), 2) # 绿色表示1.3到2.3之间的
output_images.append((cat_img, 'medium'))
else:
cat_img = cv2.drawContours(img.copy(), [contour], -1, (255, 0, 0), 2) # 蓝色表示大于等于2.3的
output_images.append((cat_img, 'large'))
# 显示结果
for category, image in output_images:
cv2.imshow(f'{category}', image)
cv2.waitKey(0) # 按任意键继续显示下一个
```
请确保已经安装了`Pillow`, `opencv-python` 和 `numpy` 库。运行此代码后,会生成对应不同类别的新图像。
阅读全文