网友提问—孔洞提取-玻璃钢制品

网友提问—孔洞提取

简介: 最近有网友咨询相关算法问题,我给了一些帮助,觉得比较典型,在经过他允许后将相关资料和思路进行整理,放出来大家共同学习!一、问题:    图中这个孔是两个半圆加直线组成的,不同于普通的圆和椭圆,所以用hough变换检测效果不好,有没有什么方法可以把那个孔的轮廓给提取出来?二、分析和解体:    如果对hough的原理和使用比较了解的话(可以翻看《学习OpenCV》),就知道想利用houghcircle取出这样的轮廓使不可能的,此类问题首先是要把关键区域强化出来,然后可以考虑轮廓分析的方法。
最近有网友咨询相关算法问题,我给了一些帮助,觉得比较典型,在经过他允许后将相关资料和思路进行整理,放出来大家共同学习!
一、问题:
    图中这个孔是两个半圆加直线组成的,不同于普通的圆和椭圆,所以用hough变换检测效果不好, 有没有什么方法可以把那个孔的轮廓给提取出来?

二、分析和解体:
    如果对hough的原理和使用比较了解的话(可以翻看《学习OpenCV》),就知道想利用houghcircle取出这样的轮廓使不可能的,此类问题首先是要把关键区域强化出来,然后可以考虑轮廓分析的方法。
    基于基础算法,做到目前程度。取这样一个洞的图像,很容易被阴影干扰,需要在图片采集的时候有所注意。
connection图
 



# include "stdafx.h"
# include "opencv2/core/core.hpp"
# include "opencv2/highgui/highgui.hpp"
# include "opencv2/imgproc/imgproc.hpp"

# include <iostream >
# include <stdio.h >
# include <stdlib.h >
# include <math.h >

# include "GOCVHelper.h"

using namespace cv;
using namespace std;
using namespace GO;
RNG  rng2( 12345);
//根据轮廓的圆的特性进行选择
vector <VP >  selectShapeCircularity(Mat src,Mat & draw,vector <VP > contours, float minvalue, float maxvalue);
vector <VP >  selectShapeCircularity(vector <VP > contours, float minvalue, float maxvalue);
//计算轮廓的圆的特性
float calculateCircularity(VP contour);
//根据轮廓的圆的特性进行选择
vector <VP > selectShapeCircularity(Mat src,Mat & draw,vector <VP > contours, float minvalue, float maxvalue){
    vector <VP > result_contours;
    draw = Mat : :zeros(src.rows,src.cols,CV_8UC3);
    for ( int i = 0;i <contours.size();i ++){
        float fcompare = calculateCircularity(contours[i]);
        if (fcompare > =minvalue && fcompare < =maxvalue)
            result_contours.push_back(contours[i]);
    }
    for ( int i = 0;i <result_contours.size();i ++){
        Scalar  color  = Scalar(rng2.uniform( 0, 255),rng2.uniform( 0, 255),rng2.uniform( 0, 255));
        drawContours(draw,result_contours,i,color, - 1);
    }
    return result_contours;
}
vector <VP > selectShapeCircularity(vector <VP > contours, float minvalue, float maxvalue){
    vector <VP > result_contours;
    for ( int i = 0;i <contours.size();i ++){
        float fcompare = calculateCircularity(contours[i]);
        if (fcompare > =minvalue && fcompare < =maxvalue)
            result_contours.push_back(contours[i]);
    }
    return result_contours;
}
//计算轮廓的圆的特性
float calculateCircularity(VP contour){
    Point2f center;
    float radius = 0;
    minEnclosingCircle((Mat)contour,center,radius);
    //以最小外接圆半径作为数学期望,计算轮廓上各点到圆心距离的标准差
    float fsum = 0;
    float fcompare = 0;
    for ( int i = 0;i <contour.size();i ++){   
        Point2f ptmp = contour[i];
        float fdistenct = sqrt(( float)((ptmp.x - center.x) *(ptmp.x - center.x) +(ptmp.y - center.y) *(ptmp.y -center.y)));
        float fdiff = abs(fdistenct - radius);
        fsum = fsum + fdiff;
    }
    fcompare = fsum /( float)contour.size();
    return fcompare;
}

int _tmain( int argc, _TCHAR * argv[])
{
    //读入灰度的手部图像
    Mat src = imread( "e:/sandbox/kong.jpg");
    Mat dst = src.clone();
    Mat tmp;
    Mat draw;
    vector <VP > contours;
    vector <VP > results;
    vector <Mat > planes;
    cvtColor(src,src,COLOR_BGR2HSV);
    split(src,planes);
    //v通道
    tmp = planes[ 2].clone();
    //去除毛刺
    GaussianBlur(tmp,tmp,Size( 3, 3), 0);
    //阈值处理
    threshold(tmp,tmp, 100, 255,THRESH_OTSU);
    //反向
    bitwise_not(tmp,tmp);
    //形态学
    erode(tmp,tmp,Mat());
    dilate(tmp,tmp,Mat());
    //绘制联通区域
    contours = GO : :connection2(tmp,draw);
    //轮廓分析(圆特性)
    results = selectShapeCircularity(tmp,draw,contours,    100, 500);
    //原图绘制
    drawContours(dst,results, 0,Scalar( 0, 0, 255), 3);
    imshow( "result",dst);
    waitKey();
    return 0;
}

所用gocvhelpe可以在我的github https://github.com/jsxyhelu 上找到,我的博客地址为jsxyhelu.cnblogs.com

 

目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com
目录
相关文章
|
5月前
ChatGPT提问获取高质量答案的艺术PDF下载书籍推荐分享
**掌握ChatGPT高质量Prompt技巧的指南,教你艺术性提问以获取卓越答案。适用于各层次用户,提升内容创作效率。了解Prompt工程,作为对话模式触发器,有效引导ChatGPT生成人类般文本。点击获取PDF资源:[ChatGPT提问艺术](https://zhangfeidezhu.com/?p=334)**
66 0
ChatGPT提问获取高质量答案的艺术PDF下载书籍推荐分享
|
7月前
|
数据采集 自然语言处理 前端开发
让大模型分析csdn文章质量 —— 提取csdn博客评论在文心一言分析评论区内容
让大模型分析csdn文章质量 —— 提取csdn博客评论在文心一言分析评论区内容
108 6
|
7月前
|
JavaScript
好玩且有趣的知识!!!(你绝对感兴趣)
好玩且有趣的知识!!!(你绝对感兴趣)
32 1
|
Cloud Native Go
面试中的问题提问:如何通过提问展示你的主动性
面试中的问题提问:如何通过提问展示你的主动性
91 0
|
搜索推荐 Linux 开发者
提问的艺术
如果你是一个想要学习编程、解决技术问题或者参与开源社区的人,你可能会经常遇到需要向别人提问的情况。但是,你知道如何提问吗?你知道如何提出一个清晰、有效、有礼貌的问题吗?你知道如何得到一个满意、及时、友好的回答吗?
|
SQL 安全 搜索推荐
|
安全 搜索推荐 Unix
提问的艺术(一)
逛Q群的时候,看到一篇文章名叫:提问的艺术,当你向别人提问的时候,建议先参考下这篇文章。(有删改)
107 0
|
SQL 安全 搜索推荐
提问的艺术:如何让别人喜欢回答你的提问
提问的艺术:如何让别人喜欢回答你的提问
388 0
提问的艺术:如何让别人喜欢回答你的提问
技术人如何提问?
这也是个技术活
136 0
|
SQL 安全 搜索推荐
提问的智慧
原文网址:http://www.catb.org/~esr/faqs/smart-questions.html

热门文章

最新文章

相关内容推荐

合作伙伴

玻璃钢制品

龙岗网络公司
深圳网站优化
龙岗网站建设
坪山网站建设
百度标王推广
天下网标王
SEO优化按天计费
SEO按天计费系统