Doki·Doki 2023-05-06 20:40 采纳率: 50%
浏览 43
已结题

提取白色图像边界、边缘检测

求问如何提取图片中的白色区域的轮廓?

img

这是用红外相机拍摄的火焰图片,图中红圈区域是相机出现了问题产生的噪声。

img

我用canny算法提取边界的时候噪声会产生影响,而且边界不连续

img

机械领域研一小白,不知各位有没有方法能够去除噪声的影响,提取出白色区域的轮廓?
十分感谢!

  • 写回答

3条回答 默认 最新

  • 极客智能体-在线 2023-05-11 21:47
    关注

    以下答案由GPT-3.5大模型与博主波罗歌共同编写:
    您可以尝试以下几种方法:

    1. 形态学操作

    a. 二值化处理:将图像转换为二值图像,使白色区域为255,黑色区域为0。可以使用阈值分割等方法进行处理。

    b. 膨胀操作:使用一个结构元素对二值图像进行膨胀,可以填充白色区域中的空洞,使其更加连续。

    c. 腐蚀操作:使用一个结构元素对二值图像进行腐蚀,可以消除白色区域中的噪声点,使其更加连续。

    d. 边界提取:使用膨胀后的图像减去腐蚀后的图像,可以得到白色区域的边界。

    下面是 Python 中使用 OpenCV 库实现形态学操作的代码:

    import cv2
    import numpy as np
    
    # 读取图像
    img = cv2.imread('fire.jpg', cv2.IMREAD_GRAYSCALE)
    
    # 二值化处理
    ret, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
    
    # 定义结构元素
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
    
    # 膨胀操作
    dilated = cv2.dilate(binary, kernel)
    cv2.imshow('dilated', dilated)
    
    # 腐蚀操作
    eroded = cv2.erode(binary, kernel)
    cv2.imshow('eroded', eroded)
    
    # 边界提取
    boundaries = dilated - eroded
    cv2.imshow('boundaries', boundaries)
    
    cv2.waitKey(0)
    
    1. 霍夫变换

    a. 边缘检测:使用 Canny 算法等方法进行边缘检测,得到图像中所有的边缘。

    b. 霍夫变换:使用霍夫变换,可以将边缘检测得到的直线转换为参数方程,这样就可以方便地对直线进行处理。

    c. 直线筛选:根据直线的参数方程,可以筛选出与噪声区域相交的直线,然后把这些直线合并为一个区域。

    d. 轮廓提取:对这个区域进行轮廓提取,就可以得到目标区域的轮廓。

    下面是 Python 中使用 OpenCV 库实现霍夫变换的代码:

    import cv2
    import numpy as np
    
    # 读取图像
    img = cv2.imread('fire.jpg', cv2.IMREAD_GRAYSCALE)
    
    # 边缘检测
    edges = cv2.Canny(img, 100, 200)
    
    # 霍夫变换
    lines = cv2.HoughLinesP(edges, rho=1, theta=np.pi/180, threshold=100, minLineLength=50, maxLineGap=10)
    
    # 直线筛选
    region = np.zeros_like(img)
    for line in lines:
        x1, y1, x2, y2 = line[0]
        if 450 < x1 < 600 and 450 < x2 < 600 and 200 < y1 < 400 and 200 < y2 < 400:
            cv2.line(region, (x1, y1), (x2, y2), 255, 3)
    
    # 轮廓提取
    contours, hierarchy = cv2.findContours(region, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cv2.drawContours(img, contours, -1, (255, 255, 255), 3)
    
    cv2.imshow('result', img)
    cv2.waitKey(0)
    

    注意:

    1. 对于两种方法,两种方法只能得到白色区域的轮廓,得到的图像可能不会和原图完全重合。

    2. 针对第一种方法,结构元素的大小和形状会影响到结果,需要根据实际情况进行调整。

    3. 需要花费一定的时间来调整参数和代码,才能得到最终的结果。
      如果我的回答解决了您的问题,请采纳!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月23日
  • 已采纳回答 5月15日
  • 赞助了问题酬金15元 5月8日
  • 创建了问题 5月6日

悬赏问题

  • ¥15 ul做导航栏格式不对怎么改?
  • ¥20 用户端如何上传图片到服务器和数据库里
  • ¥15 现在研究生在烦开题,看了一些文献,但不知道自己要做什么,求指导。
  • ¥15 vivado封装时总是显示缺少一个dcp文件
  • ¥100 pxe uefi启动 tinycore
  • ¥15 我pycharm运行jupyter时出现Jupyter server process exited with code 1,然后打开cmd显示如下
  • ¥15 可否使用carsim-simulink进行四轮独立转向汽车的联合仿真,实现四轮独立转向汽车原地旋转、斜向形式、横移等动作,如果可以的话在carsim中如何进行相应设置
  • ¥15 Caché 2016 在Java环境通过jdbc 执行sql报Parameter list mismatch错误,但是同样的sql使用连接工具可以查询出数据
  • ¥15 疾病的获得与年龄是否有关
  • ¥15 opencv.js内存,CPU飙升