我使用以下MATLAB代码进行Niblack二值化。
mean= averagefilter2(image1);
meanSquare = averagefilter2(image1.^2);
standardDeviation = (meanSquare - mean.^2).^0.5;
binaryImage = image1 >= (mean + k_threshold * standardDeviation);
function img=averagefilter2(image1)
meanFilter = fspecial('average',[60 60]);
img = imfilter (image1,meanFilter);
end
(忽略黑色边框..只是为了突出显示图像边缘的白色斑点)
也就是说,在边缘附近,一些数据像素会丢失并变为白色(顶部和右侧边缘处的白色斑点)。我在这个实现中的任何地方都错了?是否有更好的“MATLAB方式”来实现它,还是应该使用嵌套循环手动计算平均值和标准差?
答案 0 :(得分:2)
可能这是由imfilter
函数的边界条件和你自己的函数averagefilter2
的perharps引起的。
过滤时,在边缘情况下,您需要访问图像外部的像素。这意味着您需要对边界外发生的事情做出假设。
imfilter
有a parameter来选择假设在外面的内容,默认情况下假设为零。这肯定会导致平均值的较小值,也许这会使二值化被删除"那里。
尝试不同的值,并确保为您自己的功能实现它。
我建议从'symmetric'