Matlab 中区域增长的公差是多少?
What is tolerance in region growing in Matlab?
下面代码中的tolerance
是什么意思,对图像有什么影响?
我的理解是,这个公差值可以从0到255。如果我使用0,输出图像就会变成全黑,如果我使用255,输出就会变成全白。
为什么我们不总是将它的值设置为 127?
https://www.mathworks.com/matlabcentral/fileexchange/35269-simple-single-seeded-region-growing
segCroissRegion.m
function Phi = segCroissRegion(input_image, x, y, tolerance)
if(x == 0 || y == 0)
imshow(input_image,[0 255]);
[x,y] = ginput(1);
end
Phi = false(size(input_image,1),size(input_image,2));
%ref = true(size(I,1),size(I,2));
PhiOld = Phi;
Phi(uint8(x),uint8(y)) = 1;
while(sum(Phi(:)) ~= sum(PhiOld(:)))
PhiOld = Phi;
segm_val = input_image(Phi);
meanSeg = mean(segm_val);
posVoisinsPhi = imdilate(Phi,strel('disk',1,0)) - Phi;
voisins = find(posVoisinsPhi);
valeursVoisins = input_image(voisins);
Phi(voisins(valeursVoisins > meanSeg - tolerance & valeursVoisins < meanSeg + tolerance)) = 1;
end
% Uncomment this if you only want to get the region boundaries
% SE = strel('disk',1,0);
% ImErd = imerode(Phi,SE);
% Phi = Phi - ImErd;
end
main.m
overlaid_image = gray_imread('region_growing.png');
[x, y] = get_one_point_from_image(overlaid_image);
tolerance = 127;
Phi = segCroissRegion(overlaid_image, x, y, tolerance);
imshow(Phi);
算法将当前区域扩大一个像素。然后将每个新像素(候选像素)的值与当前区域的平均值进行比较。如果像素值在当前平均值的容差范围内,则将其添加到该区域,否则丢弃。
所以容差可以被认为是从区域的平均值到新的候选像素的最大值"step size"。让我们举个例子:
假设我们有一个 uint8 图像,因此它的值可以在 0 到 255 之间。该区域的当前平均值是 120,容差是 30。然后只有当候选像素是值介于 90 和 150 之间。
因此,如果您将公差设置为 0,则只有当新像素的值 完全 与区域均值相同时才会添加新像素 - 这不太可能!另一方面,如果将公差设置为 255,则将添加每个像素,因为无论平均值如何,值都不能超出公差。
将容差设置为 127 将是一个非常高的步长,因此可能不是一个好主意。例如。如果当前平均值为 100,则将添加 0 到 227 之间的每个候选像素,这可能几乎是每个像素。
这都是针对 uint8 文件的。例如。您的图像存储为双倍图像,您必须使用更高的公差值!
下面代码中的tolerance
是什么意思,对图像有什么影响?
我的理解是,这个公差值可以从0到255。如果我使用0,输出图像就会变成全黑,如果我使用255,输出就会变成全白。
为什么我们不总是将它的值设置为 127?
https://www.mathworks.com/matlabcentral/fileexchange/35269-simple-single-seeded-region-growing
segCroissRegion.m
function Phi = segCroissRegion(input_image, x, y, tolerance)
if(x == 0 || y == 0)
imshow(input_image,[0 255]);
[x,y] = ginput(1);
end
Phi = false(size(input_image,1),size(input_image,2));
%ref = true(size(I,1),size(I,2));
PhiOld = Phi;
Phi(uint8(x),uint8(y)) = 1;
while(sum(Phi(:)) ~= sum(PhiOld(:)))
PhiOld = Phi;
segm_val = input_image(Phi);
meanSeg = mean(segm_val);
posVoisinsPhi = imdilate(Phi,strel('disk',1,0)) - Phi;
voisins = find(posVoisinsPhi);
valeursVoisins = input_image(voisins);
Phi(voisins(valeursVoisins > meanSeg - tolerance & valeursVoisins < meanSeg + tolerance)) = 1;
end
% Uncomment this if you only want to get the region boundaries
% SE = strel('disk',1,0);
% ImErd = imerode(Phi,SE);
% Phi = Phi - ImErd;
end
main.m
overlaid_image = gray_imread('region_growing.png');
[x, y] = get_one_point_from_image(overlaid_image);
tolerance = 127;
Phi = segCroissRegion(overlaid_image, x, y, tolerance);
imshow(Phi);
算法将当前区域扩大一个像素。然后将每个新像素(候选像素)的值与当前区域的平均值进行比较。如果像素值在当前平均值的容差范围内,则将其添加到该区域,否则丢弃。
所以容差可以被认为是从区域的平均值到新的候选像素的最大值"step size"。让我们举个例子:
假设我们有一个 uint8 图像,因此它的值可以在 0 到 255 之间。该区域的当前平均值是 120,容差是 30。然后只有当候选像素是值介于 90 和 150 之间。
因此,如果您将公差设置为 0,则只有当新像素的值 完全 与区域均值相同时才会添加新像素 - 这不太可能!另一方面,如果将公差设置为 255,则将添加每个像素,因为无论平均值如何,值都不能超出公差。
将容差设置为 127 将是一个非常高的步长,因此可能不是一个好主意。例如。如果当前平均值为 100,则将添加 0 到 227 之间的每个候选像素,这可能几乎是每个像素。
这都是针对 uint8 文件的。例如。您的图像存储为双倍图像,您必须使用更高的公差值!