我不明白为什么在“原始”双图像上使用multithresh
获得的分割与在mat2gray
缩放的同一图像上使用相同参数的分割不同。
E.g:
testimage = randi(100,[200 200]);
figure;imagesc(testimage)
threshs = multithresh(testimage,5);
l0 = imquantize(testimage,threshs);
threshs = multithresh(mat2gray(testimage),5);
l1 = imquantize(mat2gray(testimage),threshs);
此处,在我的情况下,l1
与808像素中的l0
不同。为什么? testimage
和mat2gray(testimage)
中像素之间的相对差异应该相等,只是绝对差异会发生变化。多线程的重要性如何?
答案 0 :(得分:2)
您间接遇到浮动精度错误。如果我们修改一点你的代码,只是为了可视化它
testimage = randi(100,[200 200]);
figure;imagesc(testimage)
gray_image=mat2gray(testimage);
threshs1 = multithresh(testimage,5);
l0 = imquantize(testimage,threshs1);
threshs2 = multithresh(gray_image,5);
l1 = imquantize(gray_image,threshs2);
%For this example
threshs1
%threshs1 =
% 17.6941 34.0000 50.6941 67.0000 83.6941
threshs2
%threshs2 =
% 0.1686 0.3333 0.5020 0.6667 0.8353
然后我们找到两个原始矩阵中的一个差异点
find(l0~=l1,1)
%ans =
% 67
testimage(67)
%ans =
% 34
gray_image(67)
%ans =
% 0.3333
这是浮动精度发挥作用的地方
testimage(67)==threshs1(2) % 34 == 34.0000
%ans =
% 1
gray_image(67)==threshs2(2) % 0.3333 == 0.3333
%ans =
% 0
1/3
的值未正确保存为二进制,see here for an explanation why,imquantize
必须将图片的值与>=
或类似的阈值进行比较,它将在一个案件中通过而在另一个案件中失败。
遗憾的是,我看不到修改代码的简单方法,以确保l0
和l1
在每种情况下都相同。