如何从图像中删除小形状?

时间:2017-06-18 19:40:09

标签: c++ image-processing

我有图片

enter image description here

我有以下功能

void DrawPixel(int x, int y, unsigned char r, unsigned char g, unsigned char b);
void ReadPixel(GLint x, GLint y, unsigned char &r, unsigned char &g, unsigned char &b);

目的

删除图像的小形状,图像中有4个小形状,我想删除它们。一种方法是通过每个形状有多少红色像素,如果一个形状具有少于200个红色像素,例如,我将通过用黑色绘制将其从图像中移除。这只是我想象的一种解决方案,如果有人有任何其他选择,那将是受欢迎的。

我尝试了什么

void RemoveLastNoises(){
    int x,y;
    int cont = 0;
    unsigned char r,g,b;
    int xAux;

    for(y=0;y<NewImage.SizeY()-0;y++){
        for(x=0;x<NewImage.SizeX()-0;x++){
            NewImage.ReadPixel(x,y,r,g,b);
            if(r == 255){
                cont = 0;
                while(r == 255){
                    NewImage.ReadPixel(x+cont,y,r,g,b);
                    cont = cont + 1;
                }
                if(cont < 300){
                    NewImage.DrawPixel(x,y,255,255,255);
                }
            }
            xAux = x;
            x = x+cont;
        }
        x = xAux;
    }
}

这是有效的,但只计算它在一行(x)中有多少红色像素,我觉得把它作为参考放在这里很有意思。无论如何,任何想要删除小形状的想法都会受到欢迎。

注意:不修改较大的形状,图像的高度和宽度较大,我将问题的尺寸减小为可读。

1 个答案:

答案 0 :(得分:0)

有一组称为morophological过滤器的非线性过滤器。 他们使用&#34;和&#34;和&#34;或&#34;组合以创建过滤器蒙版。 你需要做的是实现结束。因此,OpenGL不会对这些函数进行权限处理,您必须自己编写代码。为此你

  1. 如果它们总是红色,只需使用红色通道作为灰度图像
  2. 从创建的图像中创建二进制图像
  3. 从2
  4. 反转图像
  5. 使用&#39; 1创建一个过滤器蒙版,其大小足以覆盖您想要的小部件
  6. 使用过滤器遮罩
  7. 对图像进行扩张(https://en.wikipedia.org/wiki/Dilation_(morphology)
  8. 使用相同的滤镜遮罩或略小的滤镜对图像进行侵蚀(https://en.wikipedia.org/wiki/Erosion_(morphology)
  9. 再次反转图像
  10. 5和6描述了一个&#34; Closing&#34; https://en.wikipedia.org/wiki/Closing_(morphology)