我有一个人类拳头的IR(红外)图像,用转换为在IR工作的webcamera拍摄。这张照片捕获了皮肤下的静脉。我想做的就是保持拳头并摆脱周围的黑色区域。我如何在MATLAB中做到这一点?
这是我到目前为止所做的,但我只是为此获得了一个黑色图像
a=imread('1.jpg');
figure; imshow(a);
b=rgb2gray(a);
figure;
imshow(b);
[j,k]=size(b);
for g=1:j
for f=1:k
if b(j,k)>0.06
c(j,k)=0;
else c(j,k)=1;
end
end
end
figure,imshow(c);
有人可以告诉我我做错了什么,以及如何实现我的目标?此外,当我的意思是我想摆脱背景我的意思是我想要一个白色的背景而不是黑色的> Cos这个项目的目的是保留静脉,静脉将保留为黑色。然后我将采取这些点的坐标。所以我不希望背景也作为坐标生成......!所以我希望背景为白色..!怎么做?
答案 0 :(得分:3)
您想要做的是segmentation,这是图像处理的一个重要主题。你的图像相当不错,所以如果你有图像处理工具箱,这很容易。即使你不这样做仍然没有那么难。
正如克里斯所提到的,你应该在做任何事情之前将你的形象转换为双倍。如果您有图像处理工具箱,则可以使用函数graythresh来查找最佳阈值级别。请注意,您不需要使用for循环来进行阈值处理,在MATLAB中,您可以在一行中对整个矩阵进行阈值处理。
b = im2double(b); %convert to double
thresh_level = graythresh(b); %find best threshold level
c = b > thresh_level; %do thresholding
imshow(c)
这会给你一个二进制图像,你的拳头的值为1,背景标签为0.为了保持拳头的原样,我们将二进制版本与原始版本相乘。现在背景全部为零,并且拳头保持其原始值。
d = im2double(c).*b; %c is binary, so we need to convert it first
imshow(d,[])
如果您没有图像处理工具箱,则需要手动选择阈值级别。这可能有点棘手。您使用0.06,但graythresh表明0.2980是最好的。我发现找到阈值的好方法是查看图像的直方图。
hist(b(:),256);
我们可以从直方图中清楚地看到,我们有两个点集群,2到3之间的任何值都可以很好地分离集群。所以我们应该使用该区间中的值来进行阈值处理。
答案 1 :(得分:1)
我看到了几个问题:
在你的代码中,你使用g和f作为循环计数器,但你总是以b(j,k)的形式访问b数组。
同样,imread会读取uint8,因此您无法将其与double(0.06)进行比较。所以转换为双倍通过:
b=im2double(b);
此外,在这种情况下并不是什么大问题,但是每次循环迭代都会动态增长。如果图像很大,这将极大地阻碍代码的性能。每次通过以下方式分配:
c=ones(j,k);
在这些变化之后,它会产生类似于你拳头的东西。但是,由于背景颜色不均匀,因此效果不佳。这部分超出了我的经验范围......