木易:_/ 2024-01-20 21:18 采纳率: 55.6%
浏览 12

python识别小区域黑斑,并把他们处理

遇到的问题

这个图片里面有很多黑色的小斑点,该怎么识别,去掉这些小斑点

img


消除斑点,尽量变成这个样子

img

采用过的方法

用这个去计算面积但是不能准确识别到这些黑色的小方块

# 寻找连通域
num_labels, labels, stats, centroids = cv.connectedComponentsWithStats(closing, connectivity=4)

需要识别处理的图片如下

img

  • 写回答

2条回答 默认 最新

  • 虫鸣@蝶舞 2024-01-20 23:19
    关注

    要判断到底是点还是波,可以通过canny算法提取波的轮廓,然后计算轮廓数组的长宽和面积,通过比较阀值,筛选出点,并把点设置成白色,请看通过我的思路,GPT编写的代码和效果

    import cv2
    import numpy as np
    from PIL import Image
    
    # 加载原始图像
    original_image_path = 'path_to_your_image.jpeg'
    original_image = cv2.imread(original_image_path)
    
    # 将图像转换为灰度图
    gray_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY)
    
    # 应用高斯模糊以帮助边缘检测
    blurred = cv2.GaussianBlur(gray_image, (5, 5), 0)
    
    # 执行边缘检测
    edges = cv2.Canny(blurred, 50, 150)
    
    # 在边缘图像中找到轮廓
    contours, _ = cv2.findContours(edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    # 处理每个轮廓
    cleaned_image_array = original_image.copy()
    for contour in contours:
        # 计算轮廓的包围矩形的长宽比
        x, y, w, h = cv2.boundingRect(contour)
        aspect_ratio = float(w) / h
        
        # 计算轮廓的面积
        area = cv2.contourArea(contour)
        
        # 设置长宽比和面积的阈值
        aspect_ratio_threshold = 20  # 根据观察调整此值
        area_threshold = 100  # 根据观察调整此值
        
        # 如果轮廓比较方形(噪点或大黑点),并且面积小(不是波纹)
        if aspect_ratio < aspect_ratio_threshold and area < area_threshold:
            # 用白色填充轮廓
            cv2.drawContours(cleaned_image_array, [contour], -1, (255, 255, 255), thickness=cv2.FILLED)
    
    # 将处理后的数组转换回图像
    cleaned_image = Image.fromarray(cv2.cvtColor(cleaned_image_array, cv2.COLOR_BGR2RGB))
    
    # 保存清理后的图像
    cleaned_image_path = 'path_to_your_cleaned_image.jpeg'
    cleaned_image.save(cleaned_image_path)
    
    # 可选:显示清理后的图像
    cleaned_image.show()
    
    

    GPT的模拟结果:

    img

    评论

报告相同问题?

问题事件

  • 创建了问题 1月20日