首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Matlab中查找彩色图像的轮廓/边缘

在Matlab中查找彩色图像的轮廓/边缘
EN

Stack Overflow用户
提问于 2017-07-13 07:14:22
回答 3查看 1K关注 0票数 3

我试图建立一个轮廓,在pcolor图中的‘像素’的边缘在Matlab中。这可能最好用图片来解释。这是我的数据图。黄色数据(data==1)和蓝色数据(data==0)之间有一个明显的边界:

请注意,这是一个pcolor图,所以每个‘正方形’本质上是一个像素。我想返回一个轮廓,它跟随黄色数据像素的脸,而不是--仅仅是黄色数据的边缘。

因此,输出轮廓(绿线)通过脸的中点(红点)的像素。

请注意,我不希望等高线跟随数据的中心点(黑点),这样做会像绿线一样。使用contour可以很容易地实现这一点。

此外,如果有任何帮助,我有几个网格,这可能是有用的。我在像素的中间有点(很明显,这就是我在这里画的),我在角上也有点,我在西面/东面和南北面有点。如果您熟悉Arakawa网格,这是一个Arakawa-C网格,所以我有rho-,u-,v-和psi点。

我尝试过插补,交织网格,还有其他一些东西,但是我没有任何运气。任何帮助都将是非常感谢的,并将阻止我发疯。

干杯,戴夫

编辑:

不好意思,我简化了图像,使我试图解释的更明显,但这里有一个更大(放大)的地区,我试图分开的图像:

正如你所看到的,这是一个复杂的轮廓,向“西南”方向前进,然后绕回来“东北”。这是我想画的红线,穿过黑点:

EN

Stack Overflow用户

发布于 2017-07-13 07:58:50

看看下面的代码:

代码语言:javascript
复制
% plotting some data:
data = [0 0 0 0 0 0 1 1
    0 0 0 0 0 1 1 1
    0 0 0 0 1 1 1 1
    0 0 0 0 0 1 1 1
    0 0 0 0 1 1 1 1
    0 0 0 0 1 1 1 1
    0 0 0 0 1 1 1 1];
p = pcolor(data);
axis ij
% compute the contour
x = size(data,2)-cumsum(data,2)+1;
x = x(:,end);
y = (1:size(data,1));
% compute the edges shift
Y = get(gca,'YTick');
y_shift = (Y(2)-Y(1))/2;
% plot it:
hold on
plot(x,y+y_shift,'g','LineWidth',3,'Marker','o',...
    'MarkerFaceColor','r','MarkerEdgeColor','none')

它产生了这样的结果:

这就是你要找的吗?

上面最重要的一行是:

代码语言:javascript
复制
x = size(data,2)-cumsum(data,2)+1;
x = x(:,end);

它为每一行查找0到1之间的移位位置(假设一行中只有一个)。

然后,在plot中,我将y移动到两个相邻y轴之间的距离的一半,因此它们将放置在边缘的中心。

编辑:

经过对这类数据的一些试验,我得到了这样的结果:

代码语言:javascript
复制
imagesc(data);
axis ij
b = bwboundaries(data.','noholes');
x = b{1}(:,1);
y = b{1}(:,2);
X = reshape(bsxfun(@plus,x,[0 -0.5 0.5]),[],1);
Y = reshape(bsxfun(@plus,y,[0 0.5 -0.5]),[],1);
k = boundary(X,Y,1);
hold on
plot(X(k),Y(k),'g','LineWidth',3,'Marker','o',...
    'MarkerFaceColor','r','MarkerEdgeColor','none')

这并不完美,但通过一种更简单的方法可以让你更接近你想要的东西:

票数 1
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45073798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档