【发布时间】:2015-03-14 16:15:22
【问题描述】:
我想根据像素的 RGB 颜色对一张 tiff 图像的像素进行分类。输入是一张图像和三种预定义颜色,分别用于水(r0,g0,b0)、森林(r1,g1,b1)和建筑物(r2,g2,c2)。分类是基于图像像素与这三种颜色之间的距离。如果像素离水最近,则该像素为水并将其更改为水 RGB。距离计算为(一个样本)sqrt((x-r0)^2+(y-g0)^2+(z0-b0)^2)
示例实现是:
a=imread(..);
[row col dim] = size(a); % dim =3
for i=1:row
for j=1:col
dis1=sqrtCal(a(i,j,:)-water)
dis2=sqrtCal(a(i,j,:)-forest)
dis3=sqrtCal(a(i,j,:)-build)
a(i,j,:) = water;
if dis2< dis1
dis1 = dis2
a(i,j,:) = forest
end
dis3=sqrt(a(i,j,:)-build)
if dis3<dis1
a(i,j,:) = build
end
end
end
这个实现应该可以工作。问题是这两个for循环不是一个好的选择。
那么在 Matlab 中有什么好的替代品吗?这
D = pdist(X,distance)
似乎不适用于我的情况。
【问题讨论】:
-
所以结果将是一个包含 1、2、3 个值的 MxN 数组,其中 M、N 是图像大小?而且,参考颜色的数量是否固定(在您的情况下为 3)?
-
是的,它已修复。图像为M*N*3,其中'3'为(R,G,B)
-
同时我已经为任意数量的参考颜色写了一个答案
-
您可以使用
im2double,而不是手动从uint8转换为double。