%默认8领域
I=imread('F:\20191214162428.jpg');
I1=rgb2gray(I);
I1=tofloat(I1);
I2=stdfilt(I1);
figure,imshow(I2);
m=imfilter(I1,1/9*ones(3),'replicate');
m2=mean2(I1);
I3=(I1>15*I2)&(I1>0.4*m);
figure,imshow(I3);
function [out,revertclass] = tofloat(inputimage)
% 类型转换
% 单纯的取 x 用的匿名函数句柄(玩的有点花)
identify = @(x) x;
% 将输入转换为单精度的函数句柄
tosingle = @im2single;
table = {'uint8',tosingle,@im2uint8
'uint16',tosingle,@im2uint16
'logical',tosingle,@logical
'double',identify,identify
'single',identify,identify};
% strcmp(s1,s2),输入字符串的数组可以说任意类型组合
% find 找出其中的真值
classIndex = find(strcmp(class(inputimage),table(:,1)));
if isempty(classIndex)
error('不支持的图像类型');
end
% 找到对应的转换类型
out = table{classIndex,2}(inputimage);
% 记录对应逆转换类型
revertclass = table{classIndex,3};
end
原图:
局部标准差图像:
使用局部平均值的分割结果图:
使用全局平均值的分割结果图:
可见使用全局平均值的效果更好
%自定义领域
fil=[1,0,1,0,1;
0,0,1,0,1;
1,1,0,1,0;
0,0,0,0,1;
1,1,1,1,0];
I=imread('F:\20191214162428.jpg');
I1=rgb2gray(I);
I1=tofloat(I1);
I2=stdfilt(I1,fil);
figure,imshow(I2);
fil=fil/sum(fil(:));
m=imfilter(I1,fil,'replicate');
m2=mean2(I1);
I3=(I1>11*I2)&(I1>0.9*m);
figure,imshow(I3);
function [out,revertclass] = tofloat(inputimage)
% 类型转换
% 单纯的取 x 用的匿名函数句柄(玩的有点花)
identify = @(x) x;
% 将输入转换为单精度的函数句柄
tosingle = @im2single;
table = {'uint8',tosingle,@im2uint8
'uint16',tosingle,@im2uint16
'logical',tosingle,@logical
'double',identify,identify
'single',identify,identify};
% strcmp(s1,s2),输入字符串的数组可以说任意类型组合
% find 找出其中的真值
classIndex = find(strcmp(class(inputimage),table(:,1)));
if isempty(classIndex)
error('不支持的图像类型');
end
% 找到对应的转换类型
out = table{classIndex,2}(inputimage);
% 记录对应逆转换类型
revertclass = table{classIndex,3};
end