对不起,由于某些安全原因,原始图片无法上传.以下为原理图:

原图:

original image

我的目标:

my goal

现状:

Current situation

现在我使用findContours函数来完成目标,当前使用的代码是(使用Python3和OpenCV):

edges = cv2.Canny(mask, 10, 150)
contours, _ = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(ima, [contour], -1, (0, 0, 255), 5)

我还使用了以下函数参数:

cv2.RETR_EXTERNAL,cv2.RETR_LIST,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_NONE,cv2.CHAIN_APPROX_TC89_L1,cv2.CHAIN_APPROX_TC89_KCOS

fact 原图:enter image description here

推荐答案

每个白色区域的包围盒可以用来判断简单的矩形"嵌套"关系.

使用connectedComponentsWithStats,可以获得AABB(轴对齐边界框).

(以下代码是C++.)

//Judge the rectangular nested relation
bool Is_A_Including_B( const cv::Rect &A, const cv::Rect &B, int Margin )
{
    int Left = A.x - Margin;
    int Right = Left + A.width + 2*Margin - 1;
    int Top = A.y - Margin;
    int Bottom = Top + A.height + 2*Margin - 1;
    
    auto B_br = B.br();
    return ( Left<=B.x  &&  B_br.x<=Right  &&  Top<=B.y  &&  B_br.y<=Bottom );
}

//main
int main()
{
    //Load Image and Binalize
    cv::Mat SrcImg = cv::imread( "Regs.png", cv::IMREAD_GRAYSCALE );
    if( SrcImg.empty() )return 0;

    cv::Mat BinImg;
    cv::threshold( SrcImg, BinImg, 128, 255, cv::THRESH_BINARY );

    //Find Bounding Boxes of white regions
    std::vector< cv::Rect > BBs;
    {
        cv::Mat Labels, Stats, Centroids;
        int N = cv::connectedComponentsWithStats( BinImg, Labels, Stats, Centroids );

        BBs.reserve( N-1 );
        for( int i=1; i<N; ++i )
        {
            BBs.emplace_back(
                Stats.at<int>( i, cv::CC_STAT_LEFT ),
                Stats.at<int>( i, cv::CC_STAT_TOP ),
                Stats.at<int>( i, cv::CC_STAT_WIDTH ),
                Stats.at<int>( i, cv::CC_STAT_HEIGHT )
            );
        }
    }

    //Find nested region
    std::vector< cv::Rect > Found;
    for( auto i=BBs.begin(); i!=BBs.end(); ++i )
    {
        for( auto j=BBs.begin(); j!=BBs.end(); ++j )
        {
            if( i == j )continue;
            if( Is_A_Including_B( *i, *j, 5 ) )
            {   Found.push_back( *j );  }
        }
    }

    //Visualize
    cv::Mat ShowImg;
    cv::cvtColor( BinImg, ShowImg, cv::COLOR_GRAY2BGR );
    ShowImg *= 0.5;
    for( const auto &Rect : Found )
    {
        cv::rectangle( ShowImg, Rect, cv::Scalar(0,0,255), 4 );
    }
    cv::imshow( "Result", ShowImg );
    cv::waitKey();
    return 0;
}

Result:
enter image description here

Python相关问答推荐

Snap 7- read_Area用于类似地址的变量

当测试字符串100%包含查询字符串时,为什么t fuzzywuzzy s Process.extractBests不给出100%分数?

将numpy数组与空数组相加

如何让pyparparsing匹配1天或2天,但1天和2天失败?

inspect_asm不给出输出

请从Python访问kivy子部件的功能需要帮助

在内部列表上滚动窗口

Pydantic 2.7.0模型接受字符串日期时间或无

根据条件将新值添加到下面的行或下面新创建的行中

Python json.转储包含一些UTF-8字符的二元组,要么失败,要么转换它们.我希望编码字符按原样保留

C#使用程序从Python中执行Exec文件

如何使用它?

Pre—Commit MyPy无法禁用非错误消息

如何让这个星型模式在Python中只使用一个for循环?

Python导入某些库时非法指令(核心转储)(beautifulsoup4."" yfinance)

在Python中调用变量(特别是Tkinter)

在matplotlib中使用不同大小的标记顶部添加批注

Flask运行时无法在Python中打印到控制台

Python将一个列值分割成多个列,并保持其余列相同

如何在验证文本列表时使正则表达式无序?