2

我有以下用网络摄像头拍摄的人拳头的 IR(红外)图像,转换为在 IR 中工作。图片捕捉到了皮肤下的静脉。我要做的只是保留拳头并摆脱周围的黑色区域。我如何在 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);

有人可以告诉我我做错了什么,以及如何完成我想要的吗?另外,当我的意思是我想摆脱背景时,我的意思是我想要白色背景而不是黑色背景>因为这个项目的目的是只保留静脉,静脉将保留为黑色。然后我将获取这些点的坐标。所以我不希望背景也被生成为坐标......!所以我想要背景为白色..!这个怎么做 ?

4

2 回答 2

3

您想要做的事情称为分割,是图像处理中的一个大主题。你的图像非常好,所以如果你有图像处理工具箱,这很容易。即使你不这样做,它仍然没有那么难。

正如 Chris 所提到的,在对它进行任何操作之前,您应该将图像转换为 double。如果您有图像处理工具箱,则可以使用函数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 之间的任何值都可以很好地分离集群。所以我们应该使用那个区间中的一个值来做阈值。

于 2011-04-23T12:23:14.200 回答
1

我看到了几个问题:

在您的代码中,您使用 g 和 f 作为循环计数器,但您始终将 b 数组作为 b(j,k) 访问。

同样,imread 读取的是 uint8,因此您无法将其与双精度 (0.06) 进行比较。所以通过以下方式转换为双精度:

b=im2double(b);

此外,在这种情况下也没什么大不了的,但是每次循环迭代都会动态增长 c 。如果图像很大,这将极大地阻碍代码的性能。通过以下方式分配:

c=ones(j,k);

在这些变化之后,它会产生类似于你的拳头的东西。但是,因为背景不是统一的颜色,所以效果不太好。这部分超出了我的经验范围......

于 2011-04-22T20:03:15.607 回答