【问题标题】:Connected Components Algorithm Output连通分量算法输出
【发布时间】:2015-10-15 21:12:00
【问题描述】:

我目前正在实施一种算法,用于识别图像中的连接组件。在执行自适应阈值处理后,我创建了另一个名为 sub 的 Mat 变量,我正在更新它的值,以便包含它们的值允许我使用更新的“newObject”变量识别哪些像素连接到哪个像素。

完成此操作后,我的预期输出是一张相对连接的图片,具有各种强度,可以看到哪些部分连接到哪些部分。但是,我的问题是我的子变量输出仅显示黑色图像。

我通过打印语句检查当前值来检查这些值是否实际发生变化。我还在 if 语句中放置了各种打印语句,并了解到它们确实输入了我更改子变量中像素值的条件。

我的问题是当我对子变量执行 imshow 函数时,为什么我的输出图像是黑色图像。对不起,如果我在某个地方犯了错误,我在这方面相对较新。

for(int i = 0; i < detected_edges.rows; i++){
        for(int j = 0; j < detected_edges.cols; j++){
            if(detected_edges.at<uchar>(i,j) > 0){
                Point current = (i,j);
                if(i-1 < 0 && j-1 < 0){
                    newObject = newObject + 15;     //no values
                    sub.at<uchar>(current) = newObject;
                    printf("This is the value at this point: %u", sub.at<uchar>(current));
                }else if(i-1 >= 0 && j-1 < 0){
                    Point up = (i-1,j);
                    if(sub.at<uchar>(up) != 0){
                        sub.at<uchar>(current) = sub.at<uchar>(up);                 //only up has value
                    }else{
                        newObject = newObject + 15;                                             //no values
                        sub.at<uchar>(current) = newObject;
                    }
                }else if(i-1 < 0 && j-1 >= 0){
                    Point left = (i,j-1);
                    if(sub.at<uchar>(left) != 0){
                        sub.at<uchar>(current) = sub.at<uchar>(left);               //only left has value
                    }else{
                        newObject = newObject + 15;                                 //no values
                        sub.at<uchar>(current) = newObject;
                    }
                }else{
                    Point up = (i-1,j);
                    Point left = (i,j-1);
                    if(sub.at<uchar>(up) == 0 && sub.at<uchar>(left) == 0){

                        newObject = newObject + 15;                                             //no values
                        sub.at<uchar>(current) = newObject;
                    }else if(sub.at<uchar>(up) == sub.at<uchar>(left)){             //same value
                        sub.at<uchar>(current) = sub.at<uchar>(up);
                    }else if(sub.at<uchar>(up) != sub.at<uchar>(left) && (sub.at<uchar>(up) != 0 && sub.at<uchar>(left) != 0)){
                        sub.at<uchar>(current) = sub.at<uchar>(up);                 //different values follow upper's value
                    }else if((sub.at<uchar>(up) != 0 && sub.at<uchar>(left) == 0)){
                        sub.at<uchar>(current) = sub.at<uchar>(up);                 //only up has value
                    }else if(sub.at<uchar>(up) == 0 && sub.at<uchar>(left) != 0 ){
                        sub.at<uchar>(current) = sub.at<uchar>(left);               //only left has value
                    }
                }
            }
        }
    }

更新:我注意到只有我在“sub”Mat 变量中的第一行由于某种原因正在更改值,即使循环到达图像的最后一行。

【问题讨论】:

    标签: c++ opencv image-processing


    【解决方案1】:

    图像为黑色的原因是因为我通过制作更多对象来超出灰度图像的值范围 (0-255)。我使用 2D 数组执行了不同的实现,并实现了算法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-06
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      相关资源
      最近更新 更多