图像处理--->获取图像特征

  • 获取特征
  • 取斜率函数
  • 求方差函数
  • 完整代码

获取特征

在进行第一遍扫线后,我们当然希望能够尽可能的获取图像的特征,让我们对于当前的图像有个大体的认识,方便我们进行特殊元素的判断。
因此在第一遍扫线结束后,我对获取的左线,右线和中线进行处理,获得如下的特征:

 Left_lian[i]//左线第i行到第几行之间是连续的Right_lian[i]//右线第i行到第几行之间是连续的L_start//左线最小的非丢线行R_start//右线最小的非丢线行low_lose_number//前20行丢线行数Left_lose[i]//左线到第i行为止的丢线数Right_lose[i]//右线到第i行为止的丢线数Left_lose_sum//左线的总丢线数Right_lose_sum//右线的总丢线数variance_Left//左线方差variance_Right//右线方差variance_Left_40 //左线方差超过40的行数variance_Right_40 //右线方差超过40的行数variance_LCenter_40 //中线方差超过40行数

取斜率函数

这个函数用的是比较多的,其实就是最小二乘法求出斜率之后记录下来

        byte Get_stright_line(byte rec_1, byte end_1, byte rec_2, byte end_2, byte type)//最小二乘法拟合直线{if (rec_1 < 0) rec_1 = 0;if (end_1 < 0) end_1 = 0;if (rec_2 < 0) rec_2 = 0;if (end_2 < 0) end_2 = 0;byte n = 0;int x_add = 0;int y_add = 0;int xy_add = 0;int xx_add = 0;if (type == 0){for (byte i = rec_1; i < 60 && i < end_1; i++){x_add += i;y_add += L_black[i];xx_add += i * i;xy_add += i * L_black[i];n++;}for (byte i = rec_2; i < 60 && i < end_2 && i > end_1; i++){x_add += i;y_add += L_black[i];xx_add += i * i;xy_add += i * L_black[i];n++;}}else if (type == 1){for (byte i = rec_1; i < 60 && i < end_1; i++){x_add += i;y_add += R_black[i];xx_add += i * i;xy_add += i * R_black[i];n++;}for (byte i = rec_2; i < 60 && i < end_2 && i > end_1; i++){x_add += i;y_add += R_black[i];xx_add += i * i;xy_add += i * R_black[i];n++;}}else if (type == 2){for (byte i = rec_1; i < 60 && i < end_1; i++){x_add += i;y_add += LCenter[i];xx_add += i * i;xy_add += i * LCenter[i];n++;}for (byte i = rec_2; i < 60 && i < end_2 && i > end_1; i++){x_add += i;y_add += LCenter[i];xx_add += i * i;xy_add += i * LCenter[i];n++;}}double x_bar = x_add * 1.0 / n;double y_bar = y_add * 1.0 / n;double xx_bar = xx_add * 1.0 / n;double xy_bar = xy_add * 1.0 / n;if (n < 2){if (type == 0){curve_a = k_left;curve_b = b_left;}else if (type == 1){curve_a = k_right;curve_b = b_right;}else{curve_a = k_left + k_right;curve_b = (b_right + b_left) / 2;}return n;}curve_a = (float)((xy_bar - x_bar * y_bar) / (xx_bar - x_bar * x_bar)); //拟合直线斜率curve_b = (float)(y_bar - curve_a * x_bar);//拟合直线的常数项return n;}

求方差函数

求方差用的其实就是最小二乘法
首先取一段边线得到左线的斜率,之后求方差

        int Get_variance(byte type)//求方差{if (type == 0) Get_stright_line(L_start, (byte)(Lose_line * 0.80), 68, 68, type);else if (type == 1) Get_stright_line(R_start, (byte)(Lose_line * 0.80), 68, 68, type);else if (type == 2) Get_stright_line(15, 27, 68, 68, type);if (type == 0){k_left = curve_a;b_left = curve_b;}else if (type == 1){k_right = curve_a;b_right = curve_b;}else if (type == 2){k_middle = curve_a;b_middle = curve_b;}double ans = 0;for (byte i = 0; i < Lose_line && i < 55; i++){int num = (int)(curve_a * i + curve_b);if (num > 185) num = 185;if (num < 0) num = 0;if (type == 0) ans += (float)(L_black[i] - num) * (L_black[i] - num) / Lose_line;else if (type == 1) ans += (float)(R_black[i] - num) * (R_black[i] - num) / Lose_line;else if (type == 2) ans += (float)(LCenter[i] - num) * (LCenter[i] - num) / Lose_line;if (ans > 10000) break;if (ans > 40 && variance_Left_40 == 68 && type == 0){variance_Left_40 = i;//            SetText("左超40点" + variance_Left_40);}if (ans > 40 && variance_Right_40 == 68 && type == 1){variance_Right_40 = i;//            SetText("右超40点" + variance_Right_40);}if (ans > 40 && variance_LCenter_40 == 68 && type == 2){variance_LCenter_40 = i;//            SetText("中线超40" + variance_LCenter_40);}}return (int)ans;}

完整代码

        void image_get_data(){for (byte i = 0; i < 69; i++){if (i > 1){if (my_abs(my_abs(L_black[i], L_black[i - 1]), my_abs(L_black[i - 1], L_black[i - 2])) < 3|| (my_abs(my_abs(L_black[i], L_black[i - 1]), my_abs(L_black[i], L_black[i + 1])) < 3 && my_abs(L_black[i], L_black[i - 1]) < number_lian)) Left_lian[i] = Left_lian[i - 1];else Left_lian[i] = i;if (my_abs(my_abs(R_black[i], R_black[i - 1]), my_abs(R_black[i - 1], R_black[i - 2])) < 3|| (my_abs(my_abs(R_black[i], R_black[i - 1]), my_abs(R_black[i], R_black[i + 1])) < 3 && my_abs(R_black[i], R_black[i - 1]) < number_lian)) Right_lian[i] = Right_lian[i - 1];else Right_lian[i] = i;}if ((L_black[i] != 185 || i > Lose_line) && L_start == 69) L_start = i;if ((R_black[i] != 0 || i > Lose_line) && R_start == 69) R_start = i;if (i <= 20 && L_black[i] == 185 && R_black[i] == 0) low_lose_number++;if (i != 0) Left_lose[i] = Left_lose[i - 1];if (i != 0) Right_lose[i] = Right_lose[i - 1];if (L_black[i] == 185 && i < Lose_line){Left_lose[i]++;Left_lose_sum++;}if (R_black[i] == 0 && i < Lose_line){Right_lose[i]++;Right_lose_sum++;}}variance_Left = Get_variance(0);variance_Right = Get_variance(1);}

图像处理------>获取图像特征相关推荐

  1. lbp特征提取算法 知乎_计算机视觉基础-图像处理: LBP特征描述算子

    1 简介 LBP指局部二值模式(Local Binary Pattern),是一种用来描述图像局部特征的算子,具有灰度不变性和旋转不变性等显著优点.LBP常应用于人脸识别和目标检测中,在OpenCV中 ...

  2. 【图像处理】——特征匹配(SIFT特征检测器+FLANN特征匹配方法+KNN近邻最优匹配筛选)——cv.xfeatures2d.SIFT_create()sift.detectAndCompute

    转载请注明地址 目录 1.特征检测和特征匹配方法 (1)特征检测算法 (2)特征匹配算法 (3)各种特征检测算法的比较 2.特征匹配的基本步骤(附带主要的函数) (1)图像预处理--灰度化(模板--查 ...

  3. 图像处理之特征描述与匹配

    本节中主要介绍以下两点: BRIEF算法介绍 ORB介绍 一.BRIEF(二进制的鲁棒独立基本特征)的原理介绍 **BRIEF提供了一种直接查找二进制字符串而无需查找描述符的快捷方式.**它需要平滑的 ...

  4. 《计算机视觉工程师养成计划 》·数字图像处理·数字图像特征·链码

    定义 链码用于表示由顺次连接的具有指定长度和方向的直线断组成的边界线.典型的表示方法是根据链 斜率不同.有4链码或8链码.每一段(相邻两顶点的连线)的方向是用数字编号方法进行编码.从起点开始,沿边界编 ...

  5. OpenCV图像处理--获取图像属性

    原图: 获取图像常用属性 通过调用Mat类的公有成员变量,可以获取图像的标志位.尺寸.行高.列宽.图像维度等常用属性. Mat类矩阵类型说明 Mat类矩阵类型可以是CV_8UC3.CV_16SC1-C ...

  6. 图像处理-特征融合:相加、拼接、Attention

    目录 前言 1 低层/高层特征 2 早/晚融合-Concat/Add 3 Attention特征融合 前言 特征融合是指来自不同层或分支的特征的组合,是现代网络体系结构中很常见的一种操作.图像处理的特 ...

  7. 1.数字图像获取:1.4图像的数据结构与特征

    图像的数据结构和文件格式是指数字图像在计算机中存储的组织方式,是计算机算法应用于图像处理的数据基础. ---------------数据结构------------ 图像的数据结构是指图像像素灰度值的 ...

  8. 数字图像处理知识点总结

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|新机器视觉 数字图像处理知识点总结 第一章 导论 1.   ...

  9. 数字图像处理-1.图像获取

    一.图像数字化 原理:图像数字化是将一幅画面转化成计算机能处理的形式--数字图像的过程. 将一幅图像分割成如图的一个个小区域(像元或像素),并将各小区域灰度用整数表示,形成一幅点阵式的数字图像. 包括 ...

最新文章

  1. c 自定义实现string类 clear_基于scala2.13实现自定义的集合类 (下)
  2. 如何用Dart写一个单例
  3. 社区的代码规范及e2e测试
  4. Server.Transfer 和 Response.Redirect 的用法
  5. mysql 主从_搭建mysql主从并编写监控主从状态脚本
  6. 简单的反U盘病毒(删除不了的畸形文件夹)
  7. Java串口通信详解(转)
  8. Redis精进:List的使用和应用场景
  9. 页面中flash文件的加载
  10. img标签过滤加fs模块实现图片文件缓存
  11. 攻防世界 ics-05 write up
  12. java蓝桥杯发现环,第八届蓝桥杯C/C++程序设计本科B组决赛 ——发现环(编程大题_签到题_tarjan判环)...
  13. 在线浏览 Stata 15 PDF 全套电子手册
  14. 编程算法题:101个数字,[1,100]中有一个是重复的,找出这个重复的数字。
  15. Turbo-rack技术背景及简介
  16. ndows 未能启动,Windows未能启动F8无效怎么办?
  17. 操作系统-页面置换算法
  18. 电脑——如何配置一台电脑
  19. 收录拒绝指定ip请求黑名单lua脚本、拒绝ip频次请求的lua脚本
  20. WinBUGS对多元随机波动率模型:贝叶斯估计 模型比较

热门文章

  1. BetaFlight模块设计之二:SERIAL任务分析
  2. 【verilog_8】: 设计60进制计数器,带异步复位、同步使能、同步装载、同步清零、同步置位
  3. 服务器监控管理系统效益,物流车辆gps监控管理系统分析.pdf
  4. 未来已来:探寻2019智博会上的前沿科技
  5. CAN总线多节点通信异常分析及解决
  6. rock64搭建superset(适用于其他linux服务器)
  7. Java:数组与字符串
  8. 什么是消防设施操作员,就业前景如何
  9. 1179:最小公倍数和最大公约数
  10. 【Matlab 六自由度机器人】基于蒙特卡罗方法(Monte Carlo Method)构建机器人工作空间(附MATLAB建模仿真完整代码)