对理论感兴趣的同学可以参考 基于局部otsu分割与hough变换的海天线检测 这边文献,我的代码是依据该文献实现的。

IDE:vs2015

依赖项:opencv 3.x

一.对图像做中值滤波

opencv现成的函数

    cv::Mat src1 = imread("test1.png");cv::Mat srcGray;//转换为二值图像cvtColor(src1, srcGray, CV_BGR2GRAY);//中值滤波,过滤噪声medianBlur(srcGray, srcGray, 3);

二、otsu图像分割

//otsu 最大类间距算法,通过灰度直方图,找出阈值。
//类似k-means 聚类算法
int otsu(cv::Mat image)
{assert(!image.empty());int width = image.cols;int height = image.rows;int x = 0, y = 0;int pixelCount[256];float pixelPro[256];int i, j, pixelSum = width * height, threshold = 0;uchar* data = (uchar*)image.data;//初始化for (i = 0; i < 256; i++){pixelCount[i] = 0;pixelPro[i] = 0;}//统计灰度级中每个像素在整幅图像中的个数for (i = y; i < height; i++){for (j = x; j < width; j++){pixelCount[data[i * image.step + j]]++;}}//计算每个像素在整幅图像中的比例for (i = 0; i < 256; i++){pixelPro[i] = (float)(pixelCount[i]) / (float)(pixelSum);}//经典ostu算法,得到前景和背景的分割//遍历灰度级[0,255],计算出方差最大的灰度值,为最佳阈值float w0, w1, u0tmp, u1tmp, u0, u1, u, deltaTmp, deltaMax = 0;for (i = 0; i < 256; i++){w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;for (j = 0; j < 256; j++){if (j <= i) //背景部分{//以i为阈值分类,第一类总的概率w0 += pixelPro[j];u0tmp += j * pixelPro[j];}else       //前景部分{//以i为阈值分类,第二类总的概率w1 += pixelPro[j];u1tmp += j * pixelPro[j];}}u0 = u0tmp / w0;        //第一类的平均灰度u1 = u1tmp / w1;        //第二类的平均灰度u = u0tmp + u1tmp;        //整幅图像的平均灰度//计算类间方差deltaTmp = w0 * (u0 - u)*(u0 - u) + w1 * (u1 - u)*(u1 - u);//找出最大类间方差以及对应的阈值if (deltaTmp > deltaMax){deltaMax = deltaTmp;threshold = i;}}//返回最佳阈值;return threshold;
}

三、边缘提取

//对二值图像做边缘提取,没有采用canny
//对二值图像的纵向相邻像素做异或处理,提取像素值跳跃边界线
cv::Mat edge(cv::Mat image)
{cv::Mat dst = cv::Mat::zeros(image.rows, image.cols, CV_8UC1);uchar* data = (uchar*)image.data;uchar* data1 = (uchar*)dst.data;for (int i = 0; i<image.cols; i++){for (int j = 0; j<image.rows - 1; j++){int a = data[j * image.step + i];int b = data[(j + 1) * image.step + i];int  c = a^b;data1[j * image.step + i] = c;}}return dst;
}

四、hough变换提取直线

//霍夫变换
/*功能:将输入图像按照给出参数要求提取线段,放在lines中。lines : 是一个vector<Vec4i>, Vec4i是一个包含4个int数据类型的结构体,[x1, y1, x2, y2], 可以表示一个线段。rho : 就是一个半径的分辨率。 以像素为单位的距离精度。 另一种形容方式是直线搜索时的进步尺寸的单位半径。theta : 角度分辨率。以弧度为单位的角度精度。另一种形容方式是直线搜索时的进步尺寸的单位角度threshold : 判断直线点数的阈值。累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。 大于阈值 threshold 的线段才可以被检测通过并返回到结果中。minLineLength:线段长度阈值。有默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。minLineGap : 线段上最近两点之间的阈值 有默认值0,允许将同一行点与点之间连接起来的最大的距离
*/
static void on_HoughLines(cv::Mat src, cv::Mat dst)
{Mat midImage = src.clone();imshow("2", midImage);waitKey(15);//调用HoughLinesP函数  vector<Vec4i> mylines;HoughLinesP(midImage, mylines, 1, CV_PI / 180, 50 + 1, 30, 10);//局部otsu和全局otsu分别设置不同的参数//循环遍历绘制每一条线段  for (size_t i = 0; i < mylines.size(); i++){Vec4i l = mylines[i];line(dst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 255, 0), 1, 8);}
}

完整代码在github上 https://github.com/Tudou880306/sea-sky-line-detection

基于otsu和hough海天线检测算法相关推荐

  1. 空间中的语义直线检测_基于语义分割的车道线检测算法研究

    龙源期刊网 http://www.qikan.com.cn 基于语义分割的车道线检测算法研究 作者:张道芳 张儒良 来源:<科技创新与应用> 2019 年第 06 期 摘 ; 要:随着半自 ...

  2. 速度最快250fps!实时、高性能车道线检测算法LaneATT

    CVPR 2021 车道线检测方向论文:Keep your Eyes on the Lane: Real-time Attention-guided Lane Detection . 论文: http ...

  3. 2D车道线检测算法总结

    关于2D车道线检测算法的总结主要分为两类:一类基于语义分割来做,一类基于anchor和关键点来做.还有基于曲线方程来做的,但是落地的话还是上面两种为主. 一.基于语义分割的车道线检测算法 1.Lane ...

  4. 基于Tusimple数据集在windows cpu上跑通车道线检测算法LSTR

    基于Tusimple数据集在windows cpu上跑通车道线检测算法LSTR PS:基于CULane数据集在windows cpu上跑通车道线检测算法LSTR参考: https://blog.csd ...

  5. matlab与逆透视变换,基于逆透视变换的车道线检测方法与流程

    本发明属计算机视觉.图形处理技术领域,具体涉及一种通过照度不变及逆透视变换进行车道线快速鲁棒检测的方法. 背景技术: 车道线检测作为自动驾驶技术的第一个环节,能够有效感知车辆周围世界,并获取可行驶区域 ...

  6. 车道线检测算法经典编程

    车道线检测算法经典编程 车道线曲线拟合算法编程 计算经过(50,50),(90,120),(70,200)三点的Catmull_Rom样条曲线. IplImage* img = cvCreateIma ...

  7. 详解车道线检测算法之传统图像处理

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 / 导读 / 车道线检测算法分为传统图像处理方法和深度学习方法.本文详细介绍用传统图像处理方法来解决车 ...

  8. ECCV2020 | Gen-LaneNet:百度Apollo提出两阶段的3D车道线检测算法,已开源

    点击上方"3D视觉工坊",选择"星标 干货第一时间送达 这篇文章收录于ECCV2020,是百度Apollo团队发表的关于3D车道线检测的文章,针对3D-LaneNet做了 ...

  9. ECCV2020超快车道线检测算法:Ultra Fast Structure-aware Deep Lane Detection

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:cfzd| 来源:知乎 https://zhuanlan.zhihu.com/p/1575307 ...

最新文章

  1. powershell真香
  2. oracle 登录rman,Oracle 学习之RMAN(二)由此开始
  3. ppwjs之bootstrap文字排版:排版常量
  4. VR/AR会是微信后马化腾进军的战场吗
  5. Jmeter使用基础笔记-写一个http请求
  6. 【EventBus】事件通信框架 ( 总结 | 手写事件通信框架完整代码示例 | 测试上述框架 )
  7. 使用Golang时遇到的一些坑
  8. 小鼠皮肤组织细胞悬液制备流程
  9. 【网络通信与信息安全】之深入分析Token、session和cookie的使用场景和区别
  10. C# 密封类sealed
  11. Reuse library debug in Chrome - phase3 exchange drop down list
  12. 数据结构算法入门--链表
  13. c语言 1 %3c%3c -253,结构体嵌套 姓名前后怎么输出两次??
  14. DevExpress控件介绍
  15. pandas填充缺失值
  16. MATLAB怎么输入无穷小,matlab如何输入代码
  17. android指南针校准 代码_Android:指南针的制作
  18. HTML5作品展示摄影网站网页模板源码下载
  19. verilog语言实现FPGA板的交通信号灯
  20. 安卓点击跳转到微信公众号

热门文章

  1. 视频监控基本概念及计算
  2. 《蒋炳楠:ICP备案只要用心,通过其实很简单!》
  3. 运行PHP程序时提示“Notice: Undefined index”的解决办法
  4. 将本地项目通过git 上传到github上教程
  5. 机械原理c语言,英语翻译理论力学 材料力学 机械原理 马基 电工学 机械制图 体育 线性代数 C语言 机械工程材料 互换性原理与测量 机...
  6. Linux下wordpress安装教程(全)
  7. hdu 6828-Little Rabbit‘s Equation
  8. Red Pitaya WiFI连接
  9. AS3及FLEX百条常识
  10. ARKit之路-ARKit原理