c++ 绘制函数图像_图像轮廓和分水岭算法

1. 寻找轮廓

findContours() 函数用于在二值图像中寻找轮廓。常与 drawContours() 函数配合使用;findContours() 函数检测到图像的轮廓后,就可以用 drawContours() 函数将检测到的轮廓绘制出来。

4e16482da7d48caa0fbf75f674184454.png
20c044f257a88cf54ec19600d8a29f38.png
e5227e66fa07b3b370070f42a69f6eb8.png

2. 绘制轮廓

drawContours() 函数用于在图像中绘制外部或内部轮廓。

deb58e91439f1dec735ffdb18e2b090b.png
7d4ee717038af345d4bc2d8750b02c4d.png

3. 综合例子

利用图像平滑技术(blur ()函数)和边缘检测技术(canny()函数),根据滑动条,动态地检测出图形的轮廓。

例子代码:

#include#includeusing namespace std;using namespace cv;Mat srcImg, grayImg,cannyOutImg;int ThreshValue = 80;int ThrashValueMax = 255;vector> vContours;vector vHierarchy;RNG rng(12345);void ThreshChange(int, void*);void test(){    srcImg = imread("home.jpg");    if (srcImg.empty())    {        cout <

效果图:

ea41b427d9f4b8cb53ed75d782fcacc7.png

4. 分水岭算法

044fa95d752d4ecd6b98971d4dfb4255.png
f253bab825595df3e52e6c85b105577e.png

例子代码:

#include#includeusing namespace std;using namespace cv;Mat srcImg, maskImg, cannyOutImg;Point prevPt(-1, -1);//鼠标回调函数static void Mouse(int event, int x, int y, int flags, void*);static void ShowHelpText();  //提升用户操作函数void test(){    srcImg = imread("home.jpg");    if (srcImg.empty())    {        cout <> contours;            vector hierarchy;            //寻找轮廓            findContours(maskImg, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);            //轮廓为空时的处理            if (contours.empty())                continue;            //复制掩膜            Mat maskImg2(maskImg.size(), CV_32S);            maskImg2 = Scalar::all(0);            //循环绘制出轮廓            for (int i = 0; i >= 0; i = hierarchy[i][0], compCount++)                drawContours(maskImg2, contours, i, Scalar::all(compCount+1), -1, 8, hierarchy, INT_MAX);                //compCount 为零时的处理                if (compCount == 0)                    continue;                    //生成随机颜色                    vector colorTab;                    for (int j = 0; j (i, j);                            if (index == -1)                                watershedImg.at(i, j) = Vec3b(255, 255, 255);                            else if (index <= 0 || index > compCount)                                watershedImg.at(i, j) = Vec3b(0, 0, 0);                            else                                watershedImg.at(i, j) = colorTab[index - 1];                        }                        //混合灰度图像和分水岭效果图并显示最终的窗口                        watershedImg = watershedImg*0.5 + grayImg*0.5;                        imshow("watershed transform", watershedImg);            }    }}static void Mouse(int event, int x, int y, int flags, void*){    //处理鼠标不在窗口中的情况    if (x = srcImg.cols || y = srcImg.rows)        return;    //处理鼠标左键相关消息    if (event == EVENT_LBUTTONUP || !(flags & EVENT_FLAG_LBUTTON))        prevPt = Point(-1, -1);    //处理鼠标左键按下并移动,绘制出白色线条    else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON))    {        Point pt(x, y);        if (prevPt.x 

效果图:

cf7079654373a526efd255714d73b814.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值