特殊图像过滤器

Special ImageFilter

请查看所附图片。它是通过读取更大的 16 位图像生成的矩阵的一小部分。 我想设计一个过滤器,以便所有非零值都获得最频繁数字的值我想使用模态过滤器来选择模式(内核重叠中最频繁的数字)但它不起作用对于边缘的非零数字,因为 0 将是模式。有任何想法吗?如果在Emgu CV库中找到这样的过滤器就更好了

我不认为它可以通过简单的过滤器来完成,我会这样做:

  1. 计算直方图

    • 为每种可能的颜色创建整数计数器并将其设置为零
    • 遍历所有像素 (x,y) 并递增使用的颜色计数器

      int i,x,y,cnt[65536];
      for (i=0;i<65536;i++) cnt[i]=0;
      for(y...)
       for(x...)
        cnt[pixel[y][x]]++;
      
  2. 选择最常见的非零颜色

    • 只在 cnt[] 中找到最大数,忽略索引 0
    • 找到索引ix是颜色
  3. 用该颜色替换非零像素

    • 只替换每个零像素

      for(y...)
       for(x...)
        if (pixel[y][x]!=0)
         pixel[y][x]=ix;
      

[注释]

  • C++伪代码
  • 更改 for(x/y...) 以获得正确的图像边界
  • 更改 pixel[y][x] 以获得正确的图像像素访问

感谢您的回复。 我找到了一个很好的方法。

  1. 从原始Image对象中取出一个mask m 'img'。掩码 m 告诉我们哪些像素为零,哪些像素为非零。

  2. 在 emgu CV 中通过 imgNew = img.Dilate(1) 扩大图像对象。扩张函数通过扩展与扩张核重叠的原始图像中的最大值来扩张像素。在上面的例子中,值 1056 替换了其他较小的值,例如 304、320、272 等。这些值离中心更远。

  3. 由于膨胀我们现在有更多的非零像素。可以通过命令 cvInvoke.cvMul(imgNew.Ptr, mask.Ptr, imgNew.Ptr, 1);

  4. 将 imgNew 与掩码 m 相乘
  5. 结果如下图

希望对您有所帮助。