m0_69584825 2024-07-19 14:39 采纳率: 0%
浏览 6

opencv分割冰雹

利用分水岭算法 检测图片中的冰雹 但是冰雹大小不一 而且有粘连部分 侵蚀太多导致小块冰雹直接没了 侵蚀太少粘连部分又分不开,这应该咋改啊

img

import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像
src = cv2.imread('D:/pycharm/ice/photo/4.jpg')
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray', gray)
cv2.waitKey(0)

H = 50
# 使用形态学操作实现H-minima变换
kernel = np.ones((6, 5), np.uint8)
minima = cv2.erode(gray, kernel, iterations=1)
h_minima_transformed = cv2.subtract(gray, minima)
h_minima_transformed[h_minima_transformed < H] = 0
cv2.imshow('H-minima transformed', h_minima_transformed)
cv2.waitKey(0)
cv2.destroyAllWindows()
img1 = gray+h_minima_transformed
cv2.imshow('img', img1)
cv2.waitKey(0)

ret1, th1 = cv2.threshold(img1, 200, 255, 0)
cv2.imshow('th1', th1)
cv2.waitKey(0)
k1 = np.ones((6, 3), np.uint8)
opening = cv2.morphologyEx(th1, cv2.MORPH_OPEN, k1)
cv2.imshow('opening1', opening)
cv2.waitKey(0)
k2 = np.ones((3, 3), np.uint8)
sure_bg = cv2.dilate(opening, k2, iterations=2)
sure_fg = cv2.erode(opening, k1, iterations=1)
cv2.imshow("sure_bg", sure_bg)
cv2.imshow("sure_fg", sure_fg)
cv2.waitKey(0)


dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
# Normalize the distance image for range = {0.0, 1.0}
cv2.normalize(dist_transform, dist_transform, 0, 1.0, cv2.NORM_MINMAX)
cv2.imshow('dist_transform', dist_transform)
cv2.waitKey(0)

unknown = cv2.subtract(sure_bg, sure_fg)  # unknown area
cv2.imshow('unknown', unknown)
cv2.waitKey(0)
# Marker labelling
ret, markers = cv2.connectedComponents(sure_fg)
# Add one to all labels so that sure background is not 0, but 1
markers = markers + 1
# Now, mark the region of unknown with zero
markers[unknown == 255] = 0

markers_show = np.uint8(markers)
cv2.imshow('markers', markers_show * 100)

# 分水岭算法分割
markers = cv2.watershed(src, markers=markers)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(markers)
markers_8u = np.uint8(markers)

colors = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0),
          (255, 0, 255), (0, 255, 255), (255, 128, 0), (255, 0, 128),
          (128, 255, 0), (128, 0, 255), (255, 128, 128), (128, 255, 255)]
for i in range(2, int(max_val + 1)):
    ret, thres1 = cv2.threshold(markers_8u, i - 1, 255, cv2.THRESH_BINARY)
    ret2, thres2 = cv2.threshold(markers_8u, i, 255, cv2.THRESH_BINARY)
    mask = thres1 - thres2
    cv2.imshow('mask', mask)
    cv2.waitKey(0)
    # color = (rd.randint(0,255), rd.randint(0,255), rd.randint(0,255))
    # image[markers == i] = [rd.randint(0,255), rd.randint(0,255), rd.randint(0,255)]
    # image[markers == i] = [colors[i-2]]

    contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    contours = cv2.drawContours(src, contours, -1, colors[(i - 2) % 12], -1)#图片上的划分的颜色
    #cv2.imshow('contours', contours)

   # cv2.waitKey(0)
    # cv2.drawContours(src,contours,-1,colors[(i-2)%12],-1)
    if len(contours) > 0:
        # 计算第一个轮廓的矩
        M = cv2.moments(contours[0])
        # 在这里继续处理 M 或者其他操作
    else:
        print("No contours found.")
    M = cv2.moments(contours[0])
    cx = int(M['m10'] / M['m00'])
    cy = int(M['m01'] / M['m00'])  # 轮廓重心
    cv2.drawMarker(src, (cx, cy), (150, 150, 150), 1, 10, 2)
    cv2.drawMarker(src, (cx, cy), (150, 150, 150), 1, 10, 2)

cv2.putText(src, "count=%d" % (int(max_val - 1)), (200, 30), 0, 1, (0, 255, 0), 2)#图片上的文字
cv2.imshow('regions', src)
cv2.waitKey(0)
result = cv2.addWeighted(src, 0.6, src, 0.5, 0)  # 图像权重叠加
cv2.imshow('result', result)
cv2.waitKey(0)

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-07-19 14:39
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    你的代码和问题描述都非常详细,以下是一些建议和改进方案,希望能帮助你更好地解决冰雹分割的问题:

    1. 调整形态学操作参数

    你已经尝试了使用形态学操作来处理图像,但可能需要进一步调整参数。以下是一些建议:

    • 核大小:尝试使用不同大小的核来进行侵蚀和膨胀操作,以适应不同大小的冰雹。
    • 阈值H:调整H-minima变换中的阈值H,可能需要根据冰雹的实际大小来选择一个合适的值。

    2. 优化分水岭算法

    分水岭算法在处理粘连部分时可能会遇到困难,以下是一些优化建议:

    • 预处理:在应用分水岭算法之前,进行更细致的预处理,比如使用不同的阈值或形态学操作来改善标记图像的质量。
    • 标记图像:在标记图像中,确保背景和前景的标记是连续的,避免出现孤立的标记。

    3. 使用图像分割算法

    考虑使用其他图像分割算法,如基于深度学习的分割方法,可能对粘连和大小不一的冰雹有更好的效果。以下是一些建议:

    • 深度学习模型:可以使用预训练的深度学习模型,如U-Net,来进行图像分割。这些模型通常对粘连和大小不一的物体有更好的处理效果。
    • 自定义训练:如果有足够的标注数据,可以考虑训练一个自定义的深度学习模型来专门处理冰雹的分割问题。

    4. 代码改进

    以下是一些具体的代码改进建议:

    • 形态学操作:尝试使用不同的核大小和阈值来调整形态学操作的效果。
      kernel_size = 5  # 可以尝试不同的核大小
      kernel = np.ones((kernel_size, kernel_size), np.uint8)
      minima = cv2.erode(gray, kernel, iterations=1)
      h_minima_transformed = cv2.subtract(gray, minima)
      h_minima_transformed[h_minima_transformed < H] = 0
      
    • 分水岭算法前的预处理:在应用分水岭算法之前,进行更细致的预处理。
      ret1, th1 = cv2.threshold(img1, 200, 255, 0)
      opening = cv2.morphologyEx(th1, cv2.MORPH_OPEN, k1)
      sure_bg = cv2.dilate(opening, k2, iterations=2)
      sure_fg = cv2.erode(opening, k1, iterations=1)
      
    • 标记图像的生成:确保标记图像中的背景和前景标记是连续的。
      ret, markers = cv2.connectedComponents(sure_fg)
      markers = markers + 1
      markers[unknown == 255] = 0
      

    5. 考虑使用深度学习模型

    如果传统的图像处理方法难以满足需求,可以考虑使用深度学习模型来进行更准确的图像分割。以下是一些建议:

    • U-Net:U-Net是一个常用的深度学习模型,用于图像分割任务。可以考虑使用预训练的U-Net模型,或者训练一个自定义的U-Net模型来处理冰雹的分割问题。

    希望这些建议能帮助你改进代码,更有效地分割图片中的冰雹。如果你有其他问题或需要进一步的帮助,请随时告诉我!

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月19日

悬赏问题

  • ¥15 三分类机器学习模型可视化分析
  • ¥15 本地测试网站127.0.0.1 已拒绝连接,如何解决?(标签-ubuntu)
  • ¥50 Qt在release捕获异常并跟踪堆栈(有Demo,跑一下环境再回答)
  • ¥30 python,LLM 文本提炼
  • ¥15 关于将inet引入的相关问题
  • ¥15 关于一个倒计时的操作和显示设计
  • ¥15 提问STK的问题,哪位航天领域的同学会啊
  • ¥15 苹果系统的mac m1芯片的笔记本使用ce修改器使用不了
  • ¥15 单相逆变的电压电流双闭环中进行低通滤波PID算法改进
  • ¥15 关于#java#的问题,请各位专家解答!