如何循环通过一个二值图像列检测前5个非零像素在一行?

25次浏览(过去30天)
我有一组二进制图像,从中我需要按列扫描它们的像素值。如果一行中有“x”个非零像素,算法需要识别出这一点,以便在识别出“x”个非零像素的行中绘制一条直线或完全将所有像素转换为“1”。这是为了关闭图像的一个区域,然后计算被它包围的区域。
我开始循环图像,然后将像素值保存在一个变量中。然后我添加了一个计数器,以便从它正在分析的列中计算非零像素的总数。然而,我遇到了这个循环的问题,因为它需要在一行中计数5个非零像素。如果它后面跟着一个0像素,那么它就是应该关闭的地方,但如果它后面跟着另一个非0像素,这意味着它不是感兴趣的区域。这是到目前为止我所拥有的,但它对图像没有任何影响:
[rows,columns] = size(I3);
Cont = 0;
Column = 1:表示列
Row = 1:表示行
pixel = I3(行,列);
如果(像素== 1)
Cont = Cont +1;
结束
如果(像素== 0)
Cont = 0;
结束
如果(cont == 5)
如果像素== 1
Cont = 0;
结束
如果像素== 0
I3(行,列)= 1;
打破
结束
结束
结束
结束
数字
imshow (I3)
提前谢谢你。我的matlab技能只是基本的,所以我对这种循环有困难。
任何帮助都非常感激。
3评论
雨果·阿曼多·莫拉莱斯Solís
编辑:雨果·阿曼多·莫拉莱斯Solís 2021年9月21日
嗨,抱歉让你困惑了。
二值图像是这样的。我想要 关闭 上部区域以三角形形式计算面积(这是泪膜半月板的表示)。我要实现的算法必须能够通过读取来识别撕裂半月板的上限 columnwise 每一个像素。如果只有 2个非零像素 然后是零像素,这意味着它在撕裂膜半月板界面上(上限,你可以在图像上看到有一个长矩形的部分)。它是2像素,而不是我之前提到的5像素。
它也有点不清楚的方向应该是什么。你提到“按列”工作,并“按行”查找运行。这种措辞可能是矛盾的。运行是列子向量还是行子向量?
是的,抱歉用词不当。移动是列子向量。它需要在列上找到2个连续的非零像素。如果它遇到超过2个连续的非零像素,那么它意味着我们在组织区域,而不是在上界面区域。一旦算法能够识别出这一点,那么它就会在第一次遇到该条件(两个非零像素)的行中绘制一条直线(非零像素),以关闭三角形。
我有一个更新的算法,似乎对一些图像有效,但在其他图像中,它绘制的线在需要的位置之上。似乎是代码有问题,但我被卡住了。更新后的代码如下所示:
[rows,columns] = size(I3);图像大小%
Cont = 0;初始化计数器
Flag = 0;初始化标志
J = 1:列水平读数%
I = 1:行%垂直读数
如果I3(i,j) = 1
Cont = Cont +1;
结束
如果I3(i,j) == 0
Cont = 0;
结束
如果2 .执行>
打破
其他的
如果Cont == 2
I3(i,:) = 1;
Flag = 1;
打破
结束
结束
如果Flag == 1
打破
结束
结束
结束
数字
imshow (I3);
当我把这段代码应用到上面的图像时,它画了一条像这样的线:
这或多或少是我想要的,但我认为代码仍然有一些结构问题。我认为在2-非零像素条件下,为了清楚地检测上边界,我们缺少了一些东西,因为对于其他图像来说,这条线是在需要关闭的区域上方绘制的。
我希望这能消除一点困惑。谢谢你的帮助!

登录评论。

接受的答案

Harikrishnan Balachandran Nair
编辑:Harikrishnan Balachandran Nair 2021年9月21日
你好,
我知道您正在尝试对图像进行逐列遍历,并查看是否在任何列中有两个连续的非零像素,如果有超过2个连续的非零像素,您将跳转到下一列。
在这种情况下,您可能希望在遍历下一列之前将计数器值重置为零。
此外,如果发现两个连续的非零像素,则应检查列中下一个像素的值,然后将相应行的像素合并为一个。
下面的代码可能会有所帮助。
[rows,columns] = size(I3);图像大小%
Cont = 0;初始化计数器
J = 1:列水平读数%
续= 0;
I = 1:行%垂直读数
如果(I3 (i, j) = = 0)
续= 0;
其他的
续=续+ 1;
如果(续= = 2)
如果行(我= = | | I3 (i + 1, j) = = 0)%检查是否有第三个非零像素
I3(我:)= 1;
结束
打破
结束
结束
结束
结束
数字
imshow (I3);
或者,您可以直接使用 diff '函数 matlab 查看列中相邻像素的值是否相同。
1评论
雨果·阿曼多·莫拉莱斯Solís
非常感谢!它工作。我唯一添加的是我在之前的代码中为了打破两个循环而添加的标志,因为如果我不添加它,有一些图像的线在不同的位置被绘制了不止一次。
再次感谢你花时间帮忙!祝你今天愉快

登录评论。

更多答案(0)

类别

了解更多转换图像类型帮助中心文件交换

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!