将彩色图像转换为加权邻接矩阵
一种Matlab答案的问题今天早些时候引起了我的注意。b具有加权邻接矩阵的Pseudolor图像:
他有这个颜色刻度的形象:
Borys想知道如何从该图像计算真实邻接矩阵,知道颜色尺度表示范围[0.5]。
问题对我来说看起来很有意思,我想试一试。
image_url =.“//www.tatmou.com/matlabcentral/answers/uploaded_files/410520/image.png”;scale_url =.“//www.tatmou.com/matlabcentral/answers/uploaded_files/410525/image.png”;a = imread(image_url);
这是我计划的方法:
1.使用白色正方形来确定邻接矩阵的电池的坐标网格。
2.从步骤1中的位置提取颜色。
3.对于每种提取的颜色,找到该颜色的最小颜色差异和规模中的颜色。
4.使用线性插值来确定相应的邻接矩阵单元的权重值(在0和5之间)。
我所做的第一件事是使用像素区域工具检查白色方块是否完全是白色的([255,255,255])。
imshow(a)impixelregion
他们是。
接下来,我将计算对应于白色方块的掩模图像。
面具=全部(RGB == REPAPE([255 255 255],1,1,3),3);imshow(面具)
快速浏览,似乎白色方块互相触摸,但只是肯定,让我们一点侵蚀它们。
mask2 = imerode(掩模,一个(3,3));imshow(mask2)
现在,让我们找到每个白人广场的中心。
t = RegionProps(“桌子”,mask2,“质心”);头(t)
ans = 8×1表质心________________ 5.5 5.5 19 19 32 32 44.5 45 57.5 57.5 70.545 70.545 83 83 96 96 96
将质心坐标坐在整数位置。
m =圆形(t.Centroid(:,2));n =圆形(t.Centroid(:,1));
让我们仔细检查我们的位置
图imshow(a)轴([n(1)n(6)m(1)m(6)])保持上为了q = 2:5为了r = 2:5 x = n(r);y = m(q);绘图(x,y,“o”那“MarkerfaceColor”那“W”那“markeredgecolor”那“k”)文本(x,y,“(”+ Q +“,”+ R +“)”那......“水平对齐”那“中央”那......“垂直对齐”那“底部”)结尾结尾抓住离开
看起来很好。现在,让我们提取其中一种颜色并将其与刻度上的位置匹配。
读取刻度图像并将其更改为MX3的颜色值矩阵。
scale = imread(scale_url);scale = scale(1,:,:);Scale = Rehape(比例,[],3);
抓住邻接矩阵图像的(5,3)单元中的颜色。
c = a(m(5),n(3),:);
显示颜色
图像(c)
现在找到颜色刻度最近的比赛。我会使用斯蒂树,我在我的描述30-10月 - 2020帖子。
c =重塑(C,1,3);d =δ(Repmat(C,尺寸,1),1),比例);
让我们在这一点上仔细检查我们的工作。我期望在那里是一个明确的最低限度,这识别了比例最接近的颜色。那是这种情况吗?
绘图(D)
看起来很好。
什么是最小值D.,它发生在哪里?
[d_min,idx] = min(d);d_min.
d_min =单个3.9335
idx.
IDX = 341.
现在我们可以使用插值来获得该单元格的邻接小区权重。回想一下,重量范围为0到5。
w = interp1([1尺寸(尺寸,1)],[0 5],IDX)
w = 3.7363.
我们有所有的计算。现在,让我们弄清楚每个细胞的重量。
为了q = 1:长度(m)为了r = 1:长度(n)%跳过对角线上的细胞。如果q〜= r c = a(m(q),n(r),:);c =重塑(C,1,3);c = repmat(c,size(scale,1),1);d = deltae(c,scale);[d_min,idx] = min(d);aw(q,r)= interp1([1尺寸(比例,1)],[0 5],IDx);结尾结尾结尾
最后,我们可以显示我们计算的加权邻接矩阵。除了对角元素外,它将使用此过程显示为蓝色,它应该看起来与我们开始的图像非常相似。
imshow(aw,[])colormap(比例)
蛮好玩的!
注释
要发表评论,请点击这里登录您的MathWorks帐户或创建新的。