请查看附件图片。这是一个GPR配置文件并使用图像处理技术,我试图通过用顶部整个图像的颜色标记将这个图像分成3个区域:
我应该使用哪些技巧?什么是解决它的最佳方法?
我尝试了各种技巧,但并未在每种情况下都取得成功,因为正如您在下图所示,有时抛物线太接近彼此并且识别它们正成为一个问题。
我想如何区分它的示例:https://www.dropbox.com/s/9zm9epgf0gt7591/sample.png?dl=0 尝试过的代码之一:最简单的代码。
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)
答案 0 :(得分:2)
你提出的问题不是很明确,但我花了一些时间在上面,感觉就像分享我的想法一样。我并没有暂时认为这是一个接近完整或严格答案的地方 - 只是一些可能会给你一些想法的思考。另外,我使用ImageMagick,但如果你有并且了解Matlab,你应该使用它 - 我不是建议你切换工具。
首先,我做了这样的Canny Edge检测:
convert http://i.stack.imgur.com/XITAE.png -canny 0x1+15%+50% canny.jpg
给了我这个:
然后&#34;压缩&#34; 直到它只有1个像素高,这实际上总计并平均所有列 - 我把它设为10像素高这里你可以看见。它是白色的,有很多抛物线,其他地方则少了。
然后我将它拉回到原始图像的整个高度并稍微模糊一点 - 注意到以下图像的所有内容只是一行&#34;代码&#34;:
convert http://i.stack.imgur.com/XITAE.png -canny 0x1+15%+50% -resize x1! -normalize -resize 827x310! -blur 0x11 -colorspace gray mask.png
然后我使用上面的不透明蒙版作为红色图像,其大小与原作相同:
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
备注强>
压缩像素...抱歉让您误解我的术语!基本上,当我将像素压缩到单行时,您需要想象在图像顶部放一块砖并将其展平至仅一个像素高。因此,基本上,您在图像下方绘制一条虚线,然后在图像上工作,总计每个垂直列中的WHITE(即边缘)像素数。具有更多白色像素的列将累加更大的数字。没有白色像素的列将加起来为零。获得每列的总数后,您会发现总数最高 - 让我们说它是32,然后将所有总数乘以255/32,以便将所有数据标准化为255或白色。现在,压扁的条带代表每列中的edge energy
。然后我将其用作叠加时红色的不透明度 - 因此Canny图像中具有更多白色边缘的列将在结果中显示更多红色。
让我们演示如果在缩小到原始大小之前压缩到10像素宽和1像素高的情况会发生什么 - 基本上这意味着我的结果掩码将只有10个可能的值(或列)列并且每列将是单个恒定亮度。我将Canny图像放在下面,这样你就可以看到被压扁的条带的亮度代表edge energy
:
convert http://i.stack.imgur.com/XITAE.png -canny 0x1+15%+50% -resize 10x1! -normalize -scale 827x310! mask.png
如果要引入其他颜色,则需要确定算法用于控制颜色应出现的位置。然后你再做同样的事情 - 你制作一个光亮的面具,你想要输出图像中的那种颜色,而你不想要那种颜色的颜色。然后你使用那个遮罩作为新颜色的不透明度(正如我在上面标有line 2
的行上所做的那样),然后你像我在上面代码的最后一行那样叠加它。