遇到的问题
这个图片里面有很多黑色的小斑点,该怎么识别,去掉这些小斑点
消除斑点,尽量变成这个样子
采用过的方法
用这个去计算面积但是不能准确识别到这些黑色的小方块
# 寻找连通域
num_labels, labels, stats, centroids = cv.connectedComponentsWithStats(closing, connectivity=4)
这个图片里面有很多黑色的小斑点,该怎么识别,去掉这些小斑点
用这个去计算面积但是不能准确识别到这些黑色的小方块
# 寻找连通域
num_labels, labels, stats, centroids = cv.connectedComponentsWithStats(closing, connectivity=4)
要判断到底是点还是波,可以通过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的模拟结果: