c++画出分割图像,水平线和垂直线

1、pca 找到图像某个区域的垂直线,并画出来

复制代码
    // 1、 斑块的框+ 血管二值化图,pca 找到垂直血管壁的直线,  还是根据斑块找主轴方向吧
    // Step 1: 提取斑块左右范围内的血管像素点坐标,
    std::vector<cv::Point> points;
    for (int y = 0; y < binaryVessel.rows; y++) {
        for (int x = x1; x <= x2; x++) {
            if (binaryVessel.at<uchar>(y, x) == 255) {
                points.push_back(cv::Point(x, y));
            }
        }
    }

    if (points.empty()) {
        std::cout << "====================>error No valid pixels in the specified range.  斑块附近的血管分割区域不存在,结束函数功能 " << std::endl;
        return;

    }

    // 转换为 cv::Mat 格式
    cv::Mat pointsMat(points.size(), 2, CV_32F);
    for (int i = 0; i < points.size(); i++) {
        pointsMat.at<float>(i, 0) = points[i].x;
        pointsMat.at<float>(i, 1) = points[i].y;
    }

    // Step 2: 使用 PCA  获取垂直线段斜率,感觉有点异常,不要了,改成用最小外接矩形
    // binaryPlaque    pointsMat
    cv::PCA pca(pointsMat, cv::noArray(), cv::PCA::DATA_AS_ROW);

    // Step 3: 获取主成分(直线的方向)和主成分对应的直线上的点
    cv::Mat directions = pca.eigenvectors;
    cv::Mat linePoints = pca.mean;

    // Step 4: 计算垂直线的斜率和截距
    float kVertical = -directions.at<float>(0,0) / directions.at<float>(0,1);
    float interceptHorizontal = linePoints.at<float>(0, 1) - kVertical * linePoints.at<float>(0, 0);


    // Step 5: 绘制垂直线
    float x;
    cv::Mat image22;  // 存储处理后的图像
    cv::cvtColor(binaryVessel, image22, cv::COLOR_GRAY2BGR);  // binaryVessel 转换为彩色图像  image22,存储
    for (int i = 0; i < image22.cols; i++) {
        x = static_cast<float>(i);
        float yVertical = kVertical * x + interceptHorizontal;
        cv::circle(image22, cv::Point(static_cast<int>(x), static_cast<int>(yVertical)), 1, cv::Scalar(0, 255, 0), -1);
    }
    cv::imwrite("/home/hebin/Desktop/shiyuanyin/image2.png", image22);  // 保存画图的直线

2、使用最小外接矩形的框,来找到水平线和垂直线

相关推荐
张张123y1 小时前
DSH 插件调试避坑:client.js 设置面板、热重载与高频报错排查表
开发语言·javascript·人工智能·开源·ecmascript·后端开发·ai agent
wo_jack3 小时前
C++ 入门笔记(十六):第16课 vector 模拟实现十问十答 —— 从三指针到迭代器失效
c++·后端·面试·stl·vector
D e re k ZH3 小时前
C++ 标准库算法全景指南
数据结构·c++·算法
冻柠檬飞冰走茶4 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
FRing035 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
雪落漂泊5 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
波力海苔夹心脆6756 小时前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
不会算法的笨小孩6 小时前
异常的使用以及会出现的问题
开发语言·c++·c++11·异常
Hhy_11078 小时前
《C++深度解构06》手撕 string —— 从底层内存管理到深浅拷贝彻底吃透
c语言·开发语言·c++·学习·visual studio
starzy19908 小时前
深入理解Scala函数定义:从方法到函数的类型跨越
开发语言·scala