matlab中的双阈值处理

时间:2014-05-27 21:49:10

标签: matlab image-processing

我正在寻找双阈值进行细分! 我必须在matlab中做这个算法,但我找不到任何来源!!

双重阈值:

(1)选择两个阈值T1和T2。

(2)将图像划分为三个类型区域:

R1,包含灰度值低于T1的所有像素。

R2,包含灰色值介于T1和T2之间的所有像素,包括在内。

R3,包含灰度值高于T2的所有像素。

其中R1 =核心区域,R2 =边缘(中间,过渡)区域,R3 =背景。

(3)访问区域R2中的每个像素。如果像素在区域R1中具有邻居,则将像素重新分配给区域R1。

(4)重复步骤3,直到没有重新分配像素。

(5)将区域R2中剩余的任何像素重新分配给R3。

此图片显示了我想要的内容:http://www.directupload.net/file/d/3636/3ihhmzgb_jpg.htm

我该怎么办?!请帮助我。

2 个答案:

答案 0 :(得分:5)

假设您的图像存储在名为im的变量中。还假设im采用双格式[0-1]。让我们一步一步地浏览每个部分,附带代码。

  

(1)选择两个阈值T1和T2。

让我们说T1 = 0.1T2 = 0.7。我们需要确保这些阈值处于强度谱的较低和较高端。

T1 = 0.1;
T2 = 0.7;
  

(2)将图像划分为三个类型区域:   R1,包含灰度值低于T1的所有像素。   R2,包含灰度值在T1和T2之间的所有像素,包括在内。   R3,包含灰度值高于T2的所有像素。   其中R1 =核心区域,R2 =边缘(中间,过渡)区域,R3 =背景。

我们将创建三个二进制映射,告诉我们图像中的每个条件都满足。

R1 = im < T1;
R2 = im >= T1 & im <= T2;
R3 = im > T2;
  

(3)访问区域R2中的每个像素。如果像素在区域R1中具有邻居,则重新分配   像素到区域R1。

我将假设 8-connectedness ,这意味着邻居将使用基本方向为N,NE,E,SE,S,SW,W或NW。我们可以做的是为R2取每个重叠的像素邻域并将它们放入列中。对R1执行相同操作。我们可以使用名为im2col的函数来帮助我们做到这一点。 8-connectedness 检查3 x 3像素邻域内的邻居。关于im2col的很酷的是,对于此函数的输出,中间行将包含每个邻域的中心。当我们想要重建我们的地区时,我们肯定会需要这个。当我们提取每个社区的中心时,只需检查是否:

  1. 如果区域R2中每个社区的中心评估为true
  2. R1对应邻域中的任何像素都评估为true,然后这些像素都是R2的邻居。
  3.      %//Zero-pad the regions so we can check the borders
         R1 = padarray(R1, [1 1], 'replicate');
         R2 = padarray(R2, [1 1], 'replicate');
    
         %//Transform into columns
         B1 = im2col(R1, [3 3]);
         B2 = im2col(R2, [3 3]);
    
         %//Extract size for later
         [rows cols] = size(R1); 
    
         %// Extract centre of each neighbourhood
         middleB2 = B2(5,:);
    
         % // Find the indices of those neighbourhoods that have 1 in the centre
         windowsHaving1 = find(middleB2 == 1);
    
         % // Access the corresponding neighbourhoods in R1
         % // If ANY of them have a pixel of 1, then we know
         % // these locations from R2 need to go back to R1
         % // In that case, all you really have to do is take whichever
         % // pixels are true, and set them to true in R1
    
         % // See which neighbourhoods in `R1` have any pixels that are 1
         % // given the corresponding region in R2
         finalColumns = any(B1(:,windowsHaving1), 1);
    
         % // Grab the indices of these columns
         finalColumnsIndex = windowsHaving1(finalColumns);
    
         % // Reasign those pixels that are neighbours to R1     
         B1(5, finalColumnsIndex) = 1;
         B2(5, finalColumnsIndex) = 0;
    
         %// Restructure back - Recall this image is padded
         %// We took the rows and columns of the padded image
         %// and so we need to subtract each dimension by 2
         R1 = reshape(B1(5,:), rows-2, cols-2);
         R2 = reshape(B2(5,:), rows-2, cols-2);
    
      

    (4)重复步骤3,直到没有重新分配像素。

    已经完成。

      

    (5)将区域R2中剩余的所有像素重新分配给R3。

    这非常直截了当。 R2中的所有像素都是真的,只需在R3中启用它们。

    R3 = R2 | R3;
    

    因此,您的最终双阈值图像将保留在R1R3中。如果要创建一个整数映射,告诉您哪些像素位于哪个区域,您可以执行以下操作:

    map = zeros(size(im));
    map(R1) = 1;
    map(R3) = 2;
    

    在完成双阈值过程后,任何0的像素都不符合条件。作为测试,让我们在常规图像上看一下。我将使用MATLAB路径中的cameraman.tif。因此,像这样加载图像:

    im = im2double(imread('cameraman.tif'));
    

    之后,运行我的代码。这些是我得到的结果。白色像素属于相应的区域,而黑色像素不属于。

    enter image description here

    祝你好运!

答案 1 :(得分:3)

更新受到@ rayryeng完整解决方案的启发,这是一个可行的(经过验证的)解决方案 - 我原来有一些小错误(就像你在Matlab代码之外编写的那样) Matlab环境......)。这种方法的优点是它不需要使用图像处理工具箱。

A = double(imread('cameraman.tif'))*(1/256.0); % import, scale to range 0-1
original = A; % keep a copy
T1 = 0.2;
T2 = 0.5; % thresholds

A(A>T2) = 3; % region 3
A(A<T1) = 1; % region 1
A(A~=1 & A~=3) = 2;  % region 2: the rest

% create a "padded" version
Apad = zeros(size(A)+2);
Apad(2:end-1, 2:end-1) = A; % now we have a zero border
nr = size(Apad, 1); % number of rows
numFound = 1; % initially some number > 0
neighbors = [-nr-1, -nr, -nr+1, -1, 1, nr-1, nr, nr+1]; % offset of all neighbors

% loop that does the hard work:
while numFound>0
  f2 = find(Apad==2); % indices of all elements in region 2
  i21 = bsxfun(@plus, f2(:), neighbors); % indices of all neighbors
  convert = find(any(Apad(i21) == 3, 2)); % find all pixels that have a neighbor in region 3
  numFound = numel(convert);
  Apad(f2(convert)) = 3;
end

Apad(Apad==2) = 1; % set remaining "islands" to 1
result = Apad(2:end-1, 2:end-1);

%% display results
figure('position', [100 100 900 300]);
subplot(1,3,1); imagesc(original); axis image; axis off; colormap gray
subplot(1,3,2); imagesc(A); axis image; axis off; colormap jet
subplot(1,3,3); imagesc(result); axis image; axis off; colormap gray
saveas(gcf, 'R1R2.png')

结果是(原始 - 三个地区 - 两个地区):

enter image description here

注意摄影师的裤子里有趣的事情。有两个&#34;区域2&#34;腿部区域 - 但只有其中一个&#34;连接&#34;到&#34;区域3&#34;两腿之间。因此,在最终的阈值图像中,您会看到一个区域显示为明亮,另一个区域显示为暗色。这确实是预期的行为 - 但它很好地证实了算法的效果与广告一样。