我正在寻找双阈值进行细分! 我必须在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
我该怎么办?!请帮助我。
答案 0 :(得分:5)
假设您的图像存储在名为im
的变量中。还假设im
采用双格式[0-1]
。让我们一步一步地浏览每个部分,附带代码。
(1)选择两个阈值T1和T2。
让我们说T1 = 0.1
和T2 = 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
的很酷的是,对于此函数的输出,中间行将包含每个邻域的中心。当我们想要重建我们的地区时,我们肯定会需要这个。当我们提取每个社区的中心时,只需检查是否:
R2
中每个社区的中心评估为true
R1
对应邻域中的任何像素都评估为true
,然后这些像素都是R2
的邻居。%//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;
因此,您的最终双阈值图像将保留在R1
和R3
中。如果要创建一个整数映射,告诉您哪些像素位于哪个区域,您可以执行以下操作:
map = zeros(size(im));
map(R1) = 1;
map(R3) = 2;
在完成双阈值过程后,任何0的像素都不符合条件。作为测试,让我们在常规图像上看一下。我将使用MATLAB路径中的cameraman.tif
。因此,像这样加载图像:
im = im2double(imread('cameraman.tif'));
之后,运行我的代码。这些是我得到的结果。白色像素属于相应的区域,而黑色像素不属于。
祝你好运!
答案 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')
结果是(原始 - 三个地区 - 两个地区):
注意摄影师的裤子里有趣的事情。有两个&#34;区域2&#34;腿部区域 - 但只有其中一个&#34;连接&#34;到&#34;区域3&#34;两腿之间。因此,在最终的阈值图像中,您会看到一个区域显示为明亮,另一个区域显示为暗色。这确实是预期的行为 - 但它很好地证实了算法的效果与广告一样。