填满地图的区域并保持边界

12次浏览(最近30天)
giannit
giannit 2020年5月5日
回答: 瑞安Comeau2020年5月9日
我的图像是一幅白色的意大利地图,黑色(实际上是各种深浅不一的灰色)的边界勾勒出了这个国家的每个省份。目标是在一些省份填满黑色。我读过imfill函数,但因为它用白色填充黑色区域,所以我手动编辑了图像,使每个省都用黑色填充。这样我就可以用imfill将省填充为白色。下面的代码填充两个相邻的省份:
我= imread (“https://i.imgur.com/w6osODY.png”);
BW = imbinarize(我。2);%低阈值,否则白色边界将被删除
A = imfill(BW,[760 420]);%填满一个省
(imfill(A,[780 480]))%填满另一个相邻的省份
否则,由于边界是白色的,当省份被白色填充时,它们的边界将消失,见下图
有没有办法在填满各省的同时保持边界可见?或者,一种用黑色填充白色地图上的省份的方法?(白色地图链接https://i.imgur.com/v7g4J0n.png)或者用一种不同于黑色的颜色填充?
编辑:我试图将白色的地图叠加在imfill函数获得的上面。
3评论
giannit
giannit 2020年5月5日
我在一个只包含边界的透明图像上使用imfuse,以及在使用imfill函数获得的图像上使用imfuse。效果还不错,但底色为绿色:
我= imread (“https://i.imgur.com/w6osODY.png”);%黑色地图
BW = imbinarize(我。2);
first_fill = imfill(BW,[760 420]);
第二填充= imfill(first_fill,[780 480]);
T = imread (“https://i.imgur.com/nTIVhDG.png”);%透明地图与边界
imshow (imfuse (second_fill T))
编辑:我读到[1,1,1]是白色的RGB三联体,但当运行命令时
imshow (imfuse (second_fill T“ColorChannels”, (1 1 1)))
'ColorChannels'的值是无效的
EDIT2:这个似乎不错
imfuse (second_fill T“差异”

登录评论。

答案(1)

瑞安Comeau
瑞安Comeau 2020年5月9日
你好,
因此,您需要更改区域,使其显示为白色,而边界显示为黑色。这将允许我们对图像进行“二值化”,并将其放入regionprops算法中。然后,我们将获取这个输出形式,并按您希望的方式为每个区域着色。让我们摇滚吧。
形象= imread (“路径/ /形象”);
形象=重新调节(形象,0,1);%这有助于二值化,你的图像是二进制的,当然
BW_im = imbinarize(图片);%不同类型的二值化,查看文档。
jj = regionprops (BW_im, {“重心”“PixelList”});
这个函数会返回这个区域的质心坐标,这样你就知道你在哪个区域。它将返回包含在区域中的所有像素的位置。这个过程有点特别,因为您需要遍历从regionprops返回的每个区域,但对您来说只有8个区域,并且按照您想要的方式为每个区域着色。下面是根据你的喜好给每个区域着色的代码:
color_i_want = [2, 3, 4, 5, 6, 7, 8);%你想要的灰阶颜色
i = 1:长度(jj)%%这是计算每个区域
j = 1:长度(jj (i) .PixelList (:,))%这是计算每个区域的像素
图像(jj (i) .PixelList (j,:)) = color_i_want(我);%所以如果8位grescale选择0到255。
结束
结束
如果你想单独处理一个区域,你可以取内部的for循环然后手动更改每个循环因为你会得到它的质心。你可以用下面的代码在你的图像上绘制质心:
jj.Centroid质心=猫(1)%将struct转换成矩阵
imshow (BW_im)
持有
情节(质心(:1),重心(:,2)," b *’
持有
希望这有助于
钢筋混凝土

标签

s manbetx 845


释放

R2019b

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!