gpt4 book ai didi

Java 图像连接组件

转载 作者:太空宇宙 更新时间:2023-11-04 07:38:34 26 4
gpt4 key购买 nike

我有这个程序来检测二值化 BufferedImage 中的对象,该图像是多项选择答卷。
我正在尝试使用 4-Connectivity 来检测每个对象(答案在工作表上)。
到目前为止,我手头的资料来源是:

  1. http://en.wikipedia.org/wiki/Connected-component_labeling
  2. http://homepages.inf.ed.ac.uk/rbf/HIPR2/label.htm

我按照维基百科的说明想出了这个:

if(getPixel(image, x, y) != 0){
if(getPixel(image, x-1, y) !=0){
System.out.println("we are in the same region");
region[x][y] = region[x-1][y];
}
else if(getPixel(image, x-1, y) !=0 && getPixel(image, x, y-1) !=0){
System.out.println("North and West pixels belong to the same region and must be merged");
region[x][y] = Math.min(region[x-1][y], region[x][y-1]);
}
else if( getPixel(image, x-1, y) ==0 && getPixel(image, x, y-1) !=0){
System.out.println("Assign the label of the North pixel to the current pixel");
region[x][y] = region[x][y-1];
}
else if(getPixel(image, x-1, y) ==0 && getPixel(image, x, y-1) ==0){
System.out.println("Create a new label id and assign it to the current pixel");
cpt++;
region[x][y] = cpt;
}

但问题是它创建了 51 个区域!它只打印每个对象的几个顶部像素(不是所有像素)。
谁能帮我找出问题所在以及如何检测我的对象?
我将不胜感激任何帮助。

最佳答案

您可能会得到很多区域,因为您似乎没有合并相同的标签。您的代码片段中没有用于存储相同标签的代码。该算法是双 channel 算法,其中第一 channel 分配标签,第二 channel 合并相等的标签。

以下是维基百科页面引用的条件检查:

Conditions to check:

  1. Does the pixel to the left (West) have the same value as the current pixel?
    1. Yes – We are in the same region. Assign the same label to the current pixel
    2. No – Check next condition
  2. Do both pixels to the North and West of the current pixel have the same value as the current pixel but not the same label?
    1. Yes – We know that the North and West pixels belong to the same region and must be merged. Assign the current pixel the minimum of the North and West labels, and record their equivalence relationship
    2. No – Check next condition
  3. Does the pixel to the left (West) have a different value and the one to the North the same value as the current pixel?
    1. Yes – Assign the label of the North pixel to the current pixel
    2. No – Check next condition
  4. Do the pixel's North and West neighbors have different pixel values than current pixel?
    1. Yes – Create a new label id and assign it to the current pixel

您的第二个条件检查,

else if(getPixel(image, x-1, y) !=0 && getPixel(image, x, y-1) !=0)

不检查左像素和上像素是否有不同的标签。

此外,就像 supersam654 在评论中提到的那样,第一个 else if 永远不会被调用。维基百科页面上的条件检查 (1) 和 (2) 似乎应该是相反的顺序。也就是说,首先检查左上像素是否与当前像素具有相同的值但标签不同。然后,如果检查失败,请检查左侧像素是否与当前像素具有相同的值。

因此请尝试以下操作:

  1. 将标签条件添加到第二个条件检查中。
  2. 调换前两项条件检查的顺序。
  3. 跟踪相同的标签(即哪些标签代表同一区域)。
  4. 对图像进行第二次遍历并合并相同的标签。

我希望这会有所帮助。

关于Java 图像连接组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16419066/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com