计算图像上黑色像素的长度

时间:2017-03-25 17:43:02

标签: opencv image-processing

我正在使用OpenCV操作一些图像。

假设image.png是黑/白图像(对于像素颜色仅BW)。

例如,如果我们打印第3行的颜色,可能是:

WWWWWBBBWWWWWWBBBBBBWWWWWBBWWWW

我想保存每个黑色像素序列的信息,我的意思是,我希望能够为每一行计算值:

number of black sequences in row i:(上面示例3

x-coordinate of end pixels for each black sequence in row i:(上面的示例为6,815,20以及26,27

length of each black sequence on row i:(上面示例l1=3,l2=6,l3=2)(这很容易假设上面的项目已经完成)

我使用了一些for循环并测试颜色是否为黑色。当它是黑色时,我保存x坐标并启动其他循环以从此坐标运行到行尾,测试颜色是否为白色。当它找到白色时,它会停止并保存以前的坐标。

这仅用于计算第一个黑色像素序列的长度。我不知道如何去下一个(我甚至不知道有多少)。

以下是代码的主要部分(带有一些垃圾代码):

for(int y=0;y<img.rows;y++) //img.rows
    {
        for(int x=0;x<img.cols;x++)
        {
            Vec3b color = image.at<Vec3b>(Point(x,y));
            printf("(%d,%d,%d)\n",color[1],color[2],color[3]);
            if(color[0] == 0 && color[1] == 0 && color[2] == 0)
            {
                cor[0]='B';
                ymax = y;
                if (ymin == -1) { ymin = y; }
                int xmin = x;
                int diam_esq = img.cols/2-xmin;
                double dist_esq = sqrt( (x-img.cols/2)*(x-img.cols/2) + (y-img.rows/2)*(y-img.rows/2) );
                for(int z=x;z<img.cols;z++)
                {
                    Vec3b colorz = image.at<Vec3b>(Point(z,y));
                    if(colorz[0] == 255 && colorz[1] == 255 && colorz[2] == 255)
                    {
                        int xmax = z-1;
                        int diam_dir = xmax-img.cols/2;
                        double dist_dir = sqrt( (z-1-img.cols/2)*(z-1-img.cols/2) + (y-img.rows/2)*(y-img.rows/2) );
                        int diam = xmax - xmin;
                        //printf("y=%*d, xmin=%*d, xmax=%*d, esq=%*d, dir=%*d, diam=%*d\n",5,y,5,xmin,5,xmax,5,diam_esq,5,diam_dir,5,diam);
                        printf("%*d%*d%*d%*d%*d%*d%*f%*f\n",5,y,5,xmin,5,xmax,5,diam_esq,5,diam_dir,5,diam,13,dist_esq,13,dist_dir);
                        break;
                    }
                }
                break;
            }
        }
        //break; // only y=0
    }

1 个答案:

答案 0 :(得分:0)

以下是一些可以满足您需求的代码。它只打印出结果。它并没有将它们保存在任何地方,但我认为你知道如何做到这一点。

要在每一行中查找黑色序列,不需要为每个序列执行嵌套for循环,只需跟踪您是否在黑色序列中,如果是,则在何处开始。另外,我使用ChromiumWebBrowser来逐行更有效地遍历图像。

browser.MenuHandler = new MenuHandler();