【问题标题】:MATLAB ThresholdingMATLAB 阈值
【发布时间】:2017-06-02 08:20:03
【问题描述】:

我正在使用以下 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 方式”来实现它,或者我应该使用嵌套循环手动计算平均值和标准偏差?

【问题讨论】:

  • 我建议你添加一个minimal reproducible example,意思是完整的代码来复制你的结果
  • 抱歉错误。我现在已经更新了。
  • 你试过我的建议了吗?我敢打赌,白色大约是 30 像素宽(第二个滤镜的一半)
  • 是的。非常感谢。它现在运行良好。

标签: image matlab image-processing


【解决方案1】:

这可能是由于 imfilter 函数的边界条件,以及来自您自己的函数 averagefilter2 的竖琴。

当您过滤时,在边缘情况下,您需要访问图像之外的像素。这意味着您需要对边界外发生的事情做出假设。

imfiltera parameter 来选择假定在外面的内容,默认情况下假定为零。这肯定会导致平均值较小,并且可能会使二值化在那里“删除”。

尝试不同的值,当然也可以为您自己的函数实现。

我建议从'symmetric'开始

【讨论】:

    猜你喜欢
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多