opencv——自适应阈值Canny边缘检测
2021-06-03 14:28
851 查看
前言
Canny边缘检测速度很快,OpenCV中经常会用到Canny边缘检测,以前的Demo中使用Canny边缘检测都是自己手动修改高低阈值参数,最近正好要研究点小东西时,就想能不能做个自适应的阈值,在不影响整体效果的基础上不用手动调参,话不多说,且看下文。
实现思路:
- 图像转成灰度图像
- 求其灰度直方图,并找出中位数
- 根据中位数和设定的sigma值求出高低阈值
- 使用Canny边缘检测
代码实现:
int main() { int GetMatMidVal(Mat& img); void GetMatMinMaxThreshold(Mat& img, int& minval, int& maxval, float sigma); Mat src = imread("D:/opencv练习图片/灰度图片.png"); imshow("原图", src); Mat gray,binary_1,binary_2; cvtColor(src, gray, COLOR_BGR2GRAY); GaussianBlur(gray, gray, Size(3, 3), 0.5, 0.5); int minthreshold, maxthreshold; GetMatMinMaxThreshold(gray, minthreshold, maxthreshold,0.2); cout << "min:" << minthreshold << " max:" << maxthreshold << endl; Canny(gray, binary_1, minthreshold, maxthreshold); imshow("自适应边缘", binary_1); //Canny(gray, binary_2, 100, 200, 3); //imshow("边缘", binary_2); waitKey(0); return 0; } //求Mat的中位数 int GetMatMidVal(Mat& img) { //判断如果不是单通道直接返回128 if (img.channels() > 1) return 128; int rows = img.rows; int cols = img.cols; //定义数组 float mathists[256] = { 0 }; //遍历计算0-255的个数 for (int row = 0; row < rows; ++row) { for (int col = 0; col < cols; ++col) { int val = img.at<uchar>(row, col); mathists[val]++; } } int calcval = rows * cols / 2; int tmpsum = 0; for (int i = 0; i < 255; ++i) { tmpsum += mathists[i]; if (tmpsum > calcval) { return i; } } return 0; } //求自适应阈值的最小和最大值 void GetMatMinMaxThreshold(Mat& img, int& minval, int& maxval, float sigma) { int midval = GetMatMidVal(img); cout << "midval:" << midval << endl; // 计算低阈值 minval = saturate_cast<uchar>((1.0 - sigma) * midval); //计算高阈值 maxval = saturate_cast<uchar>((1.0 + sigma) * midval); }
结论:
从上图中可以看出,命令行窗口中min和max就是求出的高低阈值,使用Canny边缘检测时直接就按这两个高低阈值处理的。对于灰度图像,效果较好。
严谨性不高,后续仍需改进!!😀😀😀
相关文章推荐
- 自适应阈值Canny边缘检测
- OpenCV图像处理篇之边缘检测算子
- android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
- opencv 学习第二天 学习opencv(中文版)对一幅图片进行canny边缘检测
- opencv python 8 Canny边缘检测
- opencv视觉学习温习(六)边缘检测
- OpenCV学习之旅2—边缘检测技术
- OpenCV自学记录(3)——(一拳超人)图像处理基础(图像平滑、边缘检测)
- 【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
- 利用OpenCV提取图像的边缘,并将检测的边缘重新保存在一个新的文件中
- OpenCV 图像腐蚀、模糊、边缘检测{erode(),blur(),canny()}
- OPENCV例程2 :CANNY算子边缘检测
- otsu自适应阈值分割的算法描述和opencv实现,及其在肤色检测中的应用
- 边缘检测︱基于 HED网络TensorFlow 和 OpenCV 实现图片边缘检测
- OpenCV教程 之 边缘检测函数:Canny、Sobel、Scharr(C++)
- Python OpenCV 学习笔记之:Canny边缘检测
- opencv——边缘检测
- 题目:opencv下对图像进行图像模糊(均值滤波)处理和边缘检测
- opencv边缘检测报错
- opencv中用Sobel算子进行边缘检测