我正在使用OpenCV操作一些图像。
假设image.png
是黑/白图像(对于像素颜色仅B
或W
)。
例如,如果我们打印第3行的颜色,可能是:
WWWWWBBBWWWWWWBBBBBBWWWWWBBWWWW
我想保存每个黑色像素序列的信息,我的意思是,我希望能够为每一行计算值:
number of black sequences in row i:
(上面示例3
)
x-coordinate of end pixels for each black sequence in row i:
(上面的示例为6,8
和15,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
}
答案 0 :(得分:0)
以下是一些可以满足您需求的代码。它只打印出结果。它并没有将它们保存在任何地方,但我认为你知道如何做到这一点。
要在每一行中查找黑色序列,不需要为每个序列执行嵌套for循环,只需跟踪您是否在黑色序列中,如果是,则在何处开始。另外,我使用ChromiumWebBrowser
来逐行更有效地遍历图像。
browser.MenuHandler = new MenuHandler();