OpenCV 滞后阈值及应用 您所在的位置:网站首页 阈值效应原理是什么 OpenCV 滞后阈值及应用

OpenCV 滞后阈值及应用

2024-06-28 05:15| 来源: 网络整理| 查看: 265

此博文仅记录学习中的一些心得,供以后参考,若能为看到的朋友提供一些帮助,那真是荣幸之至。

前言

滞后阈值在OpenCV中的应用还是较多的,例:在canny边缘检测中,通过双阈值的滞后阈值处理进行较长边缘的连接。

滞后阈值原理

1. 若某一像素位置的幅值超过高阈值,则该位置被保留。

2. 若某一像素位置的幅值低于低阈值,则该位置被去除。

3. 若某一像素位置的幅值处于高低阈值之间,则该像素仅仅在连接到一个高于高阈值像素时被保留。

滞后阈值的实现方法

1. 在高阈值图像中定义下一个未被方位的边缘像素p.

2. 在低阈值图像中将所有弱像素标记为临时有效边缘像素,在p 处用八连通的连接方式连接临时有效像素,将连接到的,标记为有效边缘像素.

3. 如果高阈值图像中的所有非零像素已被访问,则跳到步骤4,否则返回步骤1.

4. 将低阈值图像中未标记为有效边缘像素的所有像素置零。

应用

线检出时,由于光照、干扰等因素,会产生不连续的现象。该方法用于连接。

实现代码 cv::Mat srcMat = imread("Dust\\weakDustLight.bmp"); cv::Mat grayMat; if (srcMat.channels() != 1) cvtColor(srcMat, grayMat, cv::COLOR_BGR2GRAY); else grayMat = srcMat.clone(); cv::Mat NHMat; cv::Mat NLMat; cv::Mat dstMat; cv::threshold(grayMat, NHMat, 15, 1, cv::THRESH_BINARY); cv::threshold(grayMat, dstMat, 15, 2, cv::THRESH_BINARY); cv::threshold(grayMat, NLMat, 5, 1, cv::THRESH_BINARY); cv::Mat NLMat2; NLMat2 = NLMat - NHMat; bitwise_or(dstMat, NLMat2, dstMat); cv::Mat dstImg; bitwise_or(dstMat, NLMat, dstImg); cv::Mat dst; dstMat.convertTo(dst, CV_32SC1); int label = 2; int cols = dst.cols - 1; int rows = dst.rows - 1; for (int i = 1; i < rows; i++) { for (int j = 1; j < cols; j++) { if (dst.at(i, j) == label) { std::stack neighborPt; neighborPt.push(std::pair(i, j)); while (!neighborPt.empty()) { std::pair curPt = neighborPt.top(); int curX = curPt.first; int curY = curPt.second; dst.at(curX, curY) = label; neighborPt.pop(); //-1,-1 if (curX-1>=0 && curX-1 = 0 && curY - 1 = 0 && curX - 1 = 0 && curY = 0 && curX - 1 = 0 && curY + 1 = 0 && curX = 0 && curY - 1 = 0 && curX = 0 && curY + 1 = 0 && curX + 1 = 0 && curY - 1 = 0 && curX + 1 = 0 && curY = 0 && curX + 1 = 0 && curY + 1 = right) edgeMag_noMaxsup.at(r, c) = mag; } //水平边缘--梯度方向为垂直方向-3*3邻域内上下方向比较 if ((angle>=67.5 && angle=-112.5 && angle= top && mag >= down) edgeMag_noMaxsup.at(r, c) = mag; } //+45°边缘--梯度方向为其正交方向-3*3邻域内右上左下方向比较 if ((angle>112.5 && angle-67.5 && angle= right_top && mag >= left_down) edgeMag_noMaxsup.at(r, c) = mag; } //+135°边缘--梯度方向为其正交方向-3*3邻域内右下左上方向比较 if ((angle >=22.5 && angle < 67.5) || (angle >= -157.5 && angle < -112.5)){ float left_top = edgeMag.at(r - 1, c - 1); float right_down = edgeMag.at(r + 1, c + 1); if (mag >= left_top && mag >= right_down) edgeMag_noMaxsup.at(r, c) = mag; } } } //双阈值处理及边缘连接 edge = cv::Mat::zeros(rows, cols, CV_8UC1); for (int r = 1; r < rows - 1; ++r){ for (int c = 1; c < cols - 1; ++c){ float mag = edgeMag_noMaxsup.at(r, c); //大于高阈值,为确定边缘点 if (mag >= TH) trace(edgeMag_noMaxsup, edge, TL, r, c, rows, cols); else if (mag < TL) edge.at(r, c) = 0; } } } int main(){ cv::Mat src = cv::imread("I:\\Learning-and-Practice\\2019Change\\Image process algorithm\\Img\\lena.jpg"); if (src.empty()){ return -1; } if (src.channels() > 1) cv::cvtColor(src, src, CV_RGB2GRAY); cv::Mat edge,dst; //Canny Edge_Canny(src, edge, 20,60); //opencv自带Canny cv::Canny(src, dst, 20, 80); cv::namedWindow("src", CV_WINDOW_NORMAL); imshow("src", src); cv::namedWindow("My_canny", CV_WINDOW_NORMAL); imshow("My_canny", edge); cv::namedWindow("Opencv_canny", CV_WINDOW_NORMAL); imshow("Opencv_canny", dst); cv::waitKey(0); return 0; }

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有