Matlab 用图像处理技术划分探地雷达剖面

Matlab 用图像处理技术划分探地雷达剖面,matlab,image-processing,Matlab,Image Processing,请看附件中的图片。这是一个GPR配置文件,使用图像处理技术,我试图通过在顶部标记整个图像的颜色,将此图像分为3个区域: 当图像中的抛物线非常清晰且清晰,像素值较高时-顶部为绿色区域/线 当图像中的抛物线模糊但可见时-黄色区域 当抛物线扭曲或不存在抛物线时-红色区域 我应该使用什么技巧?解决这个问题的最佳方法是什么 我尝试过各种技术,但并非每种情况下都能成功,因为,正如下图所示,有时抛物线之间的距离太近,识别它们成为一个问题 我希望如何对其进行分区的示例: 尝试过的代码之一:最简单的代码 cle

请看附件中的图片。这是一个GPR配置文件,使用图像处理技术,我试图通过在顶部标记整个图像的颜色,将此图像分为3个区域:

  • 当图像中的抛物线非常清晰且清晰,像素值较高时-顶部为绿色区域/线
  • 当图像中的抛物线模糊但可见时-黄色区域
  • 当抛物线扭曲或不存在抛物线时-红色区域
  • 我应该使用什么技巧?解决这个问题的最佳方法是什么

    我尝试过各种技术,但并非每种情况下都能成功,因为,正如下图所示,有时抛物线之间的距离太近,识别它们成为一个问题

    我希望如何对其进行分区的示例: 尝试过的代码之一:最简单的代码

    clear all 
    clc
    %read png image
    H=imread ('origpng.png');
    %convert to gray scale
    I = rgb2gray(H);
    
    I(I>150)=0;I(I<100)=0;
    figure,imshow(I)
    J=I;
    J=255-J;
    figure, imshow (J)
    J(J<255)=0;
    
    figure,imshow (J)
    
    全部清除
    clc
    %读取png图像
    H=imread('origpng.png');
    %转换为灰度
    I=RGB2灰色(H);
    
    I(I>150)=0;我(我你的问题提得不太清楚,但我花了一些时间在上面,想和大家分享我的想法。我一刻也不想说这是一个接近完整或严格的答案——只是一些思考,可能会给你一些想法。此外,我使用ImageMagick,但如果你有并了解Matlab,你应该使用它——我不建议你这么做你可以切换工具

    首先,我做了如下精明的边缘检测:

    convert http://i.stack.imgur.com/XITAE.png -canny 0x1+15%+50% canny.jpg
    
    convert -size 827x310! xc:red mask.png -compose copy-opacity -composite colouredmask.png
    
    这给了我这样的信息:

    然后我把它“压缩”到只有1像素高,这实际上是所有列的总和和平均值-我在这里把它设为10像素高,这样你就可以看到它。白色的地方有很多抛物线,其他地方则更少

    然后我将其拉伸到原始图像的整个高度,并将其模糊一点——请注意,以下图像中的所有内容都只是一行“代码”:

    然后,我将上述内容用作与原始图像大小相同的红色图像的不透明度遮罩,如下所示:

    convert http://i.stack.imgur.com/XITAE.png -canny 0x1+15%+50% canny.jpg
    
    convert -size 827x310! xc:red mask.png -compose copy-opacity -composite colouredmask.png
    

    然后我把你的原始图像涂成黄色,就像这样,首先创建一个黄色图像,然后把它混合到你的图像上,然后我把上面的红色图像混合到上面:

    convert -size 827x310! xc:yellow yellow.png
    convert http://i.stack.imgur.com/XITAE.png yellow.png -compose colorize -composite colouredmask.png -compose overlay -composite result.png
    

    给予

    很明显,你可以设置不同的参数,使用不同的阈值和东西,但它有点朝着你想要的方向发展

    因此,整个过程是:

    # Make mask of peaky areas - line 1
    convert http://i.stack.imgur.com/XITAE.png -canny 0x1+15%+50% -resize x1! -normalize -resize 827x310! -blur 0x11 -colorspace gray mask.png
    
    # Colour mask with red - line 2
    convert -size 827x310! xc:red mask.png -compose copy-opacity -composite colouredmask.png
    
    # Tint original image with yellow and then overlay semi-transparent red area
    convert -size 827x310! xc:yellow yellow.png
    convert http://i.stack.imgur.com/XITAE.png yellow.png -compose colorize -composite colouredmask.png -compose overlay -composite result.png
    
    注释

    挤压像素…很抱歉把你和我的术语搞混了!基本上,当我把像素挤压成一行时,你需要想象把一块砖块放在图像的顶部,然后把它压平到只有一个像素高。所以,基本上,你在图像下面画一条假想的线,然后你在图像上画一条总高度为e白色的数量(即边缘)每个垂直列中的像素。白色像素越多的列加起来的数字就越大。没有白色像素的列加起来的数字就越大。一旦你得到了每列的总数,你就会找到最高的总数——假设它是32,然后你将所有的总数乘以255/32,这样所有的数字都被标准化为255,或白色。现在e压扁条表示每列中的
    边缘能量
    。然后我在叠加时将其用作红色的不透明度-因此Canny图像中具有更多白色边缘的列将在结果中显示更多红色

    让我们演示一下,如果我在缩放到原始大小之前压缩到10像素宽和1像素高,会发生什么情况-基本上这意味着生成的遮罩将只有10个可能的值(或列)每列都是一个恒定的亮度。我将把Canny图像放在下面,这样你就可以看到压扁条的亮度代表了
    边缘能量

    convert http://i.stack.imgur.com/XITAE.png -canny 0x1+15%+50% -resize 10x1! -normalize -scale 827x310! mask.png
    


    如果你想引入另一种颜色,你需要弄清楚你的算法是什么来控制这种颜色应该出现在哪里。然后你再做同样的事情——你在输出图像中想要的颜色处做一个明暗的遮罩。然后你用这个遮罩作为图像的不透明度ew color(正如我在上面标记为
    的第2行中所做的那样),然后您将其覆盖,就像我在上面代码的最后一行中所做的那样。

    向我们展示您所尝试的。“清晰”和“模糊”不是很有描述性的词。你如何量化抛物线有多少模糊?你甚至不告诉我们你在哪里考虑你的样本图像中的区域。我所知道的,上面的图像都是绿色的。把它放在你的帖子里。不要把它放在评论里。它看起来很难看。“卡希夫”是一种主观的方法。…你甚至还没有给我们你的主观意见。我的主观意见仍然是把整个东西涂成绿色。哈哈…我以为你是想把图像分成层,像层。哈哈哈…太多不明确的要求了。我退出了。祝你好运。很好的工作分数。我没有碰这个问题,因为我真的不明白在需求方面是。@rayryeng我也不认为我完全理解需求-但这是一个有趣的问题,虽然在这种情况下可以理解,但没有任何评论真正提供了非常具体的内容,所以我想我至少应该努力分享一些想法,看看这是否成功。谢谢。@MarkSetchell非常感谢您的解释和回答。我可以告诉您您对我的帮助有多大。很抱歉,我无法非常清楚地解释需求,因为需求本身是主观的,我必须进一步研究整个方法以找到可行的解决方案。但您肯定“已经成功了”:真的很感激!!