医学图像处理——图像边缘检测(一)——掩模的概念、点检测、线检测

上一期的内容:医学图像处理——数据类与图像类型之间的转换

 

单色图像的分割算法通常基于图像亮度值的两个基本特性:不连续性和相似性。在第一种类别中,处理方法是基于亮度的突变来分割一幅图像,如图像的边缘。在第二种类别中,主要方法是根据事先定义的准则把图像分割成相似的区域。今天小白介绍一下MATLAB中常用边缘检测的方法。

掩膜的概念

常用的点、线、边缘检测首先需要对检测的工具——掩模这一概念需要了解。拿3 x 3的掩模来说,该过程为计算系数和由掩模覆盖区域所包含的灰度级的乘积之和。换言之,掩模在该图像中任何一点处的响应R由下式给出:

 其中,z是与掩模系数w相关的像素的亮度。

在具体的计算过程中,掩模会与图形中3*3的像素矩阵进行卷积并将结果赋值给像素矩阵的中间值。具体的可由下图表示。

点检测

 

  所谓的点检测,就是对嵌在常数区域(或图像中亮度基本不变的区域)中的孤立点的检测,(比如在一大片黑点中的一个白点),基本思路就是利用掩模卷积的思路将结果大于所设阈值的点标定为二值1,反之为零。就像鹤立鸡群一样,我们可以根据身高的值来找到鹤。而其在MATLAB中的实现方式就可以通过如下函数(imfilter)操作。这次小白亲手操作了一下哟!

g=abs(imfilter(double(f),w))>=T;

f=imread("Fig1002(a).tif");

w=[-1,-1,-1;-1,8,-1;-1,-1,-1];

g=abs(imfilter(double(f),w));

T=max(g(:));

g=g>=T-370;

figure(1);

subplot(1,2,1);

imshow(f);

subplot(1,2,2);

imshow(g);

结果如下:

      可以看到当我们阈值设为最大值时就可以将左图中的一个最高亮度的点检测出来(为便于观察右图已放大,孤立点比较小,大家注意看!因为放大的缘故点的坐标在两图并不匹配)。

 

线检测

 

  所谓的线检测就是将满足在某个方向上的线从图像中检出提取出来,一般我们会用如下四种掩模。

     可以看到,若是在亮度不变的区域,来自掩模的相应会为零,若是存在与掩模方向相同的线段则其灰度值会因为加权而放大,从而能够有区别的显示在图中。同样,在这部分小白也亲手操作了一下!

f=imread("Fig1004(a).tif");

w=[2,-1,-1;-1,2,-1;-1,-1,2];

g=imfilter(double(f),w);

figure(2);

subplot(2,2,1);

imshow(g,[ ]);

gtop=g(1:120,1:120);

gtop=pixeldup(gtop,4);

subplot(2,2,2);

imshow(gtop,[ ]);

subplot(2,2,3);

imshow(f);

结果如下:

    可以看到第三张图中的斜线段大部分已被检测出(显示于图一,图二也就是右边的图则是图一的左上放大部分),那么有的人可能会问,怎么没有直线段?大家可以仔细的看我的代码,所用的掩模其实是-45度方向的,所以自然对斜线段的增强检出更好!当然大家可以把4种掩模都试一下,看看效果如何!

本次小白先只介绍点和线的检测,真正的边缘检测我们下次再说(由于比较复杂)。但大家可以想的到点线的检测肯定是后面的基础,一定要先理解这两部分的思路,才能在后面的关卡中快刀斩乱麻哟!

 

关注公众号“医电小白的进阶之路”,查看更多干货!

 

觉得有用就加个关注吧!

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是实现这个功能的 Python 代码: ```python import cv2 import numpy as np # 读入原始图像 img = cv2.imread('road.jpg') # 将原始图像转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 对灰度图像进行高斯糊去噪 blur = cv2.GaussianBlur(gray, (5, 5), 0) # 使用 Prewitt 算子进行边缘检测 prewitt_x = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]]) prewitt_y = np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]]) edge_x = cv2.filter2D(blur, -1, prewitt_x) edge_y = cv2.filter2D(blur, -1, prewitt_y) edge = cv2.addWeighted(edge_x, 0.5, edge_y, 0.5, 0) # 生成车道线的 Mask mask = np.zeros_like(edge) mask[200:400, :] = 255 # 对边缘检测结果应用 Mask masked_edge = cv2.bitwise_and(edge, mask) # 进行直线检测 lines = cv2.HoughLinesP(masked_edge, rho=1, theta=np.pi/180, threshold=50, minLineLength=50, maxLineGap=5) # 绘制车道线 for line in lines: x1, y1, x2, y2 = line[0] cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2) # 显示车道线检测结果 cv2.imshow('Lane Detection', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上述代码中,我们首先读入了原始图像,并将其转换为灰度图像。然后,我们对灰度图像进行高斯糊去噪,以减少噪声对边缘检测结果的影响。接着,我们使用 Prewitt 算子进行边缘检测,得到车道边缘线的强度图像。然后,我们生成了车道线的 Mask ,将其应用到边缘检测结果上,以过滤掉不需要的区域。最后,我们使用 cv2.HoughLinesP() 函数进行直线检测,得到车道线的端点坐标,并使用 cv2.line() 函数将其绘制在原始图像上。 需要注意的是,在实际应用中,我们需要对车道线进行拟合和平滑处理,以得到更加精确的车道线。此外,我们还可以使用其他的边缘检测算子和直线检测方法来实现车道线检测,以提高检测的精度和鲁棒性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值