【OpenCv • c++】图像识别边缘检测 图像差分运算

简介: 【OpenCv • c++】图像识别边缘检测 图像差分运算

什么是边缘检测


边缘检测是图像处理与计算机视觉中最重要的技术之一,其目的是检测识别出图像中亮度变化剧烈的像素点构成的集合。图像边缘的正确检测对于分析图像中的内容、实现图像中物体的分割、定位等具有重要的作用。边缘检测大大减少了源图像的数据量,剔除了与目标不相干的信息,保留了图像重要的结构属性。


边缘检测算子是利用图像边缘的突变性质来检测边缘的,通常情况下边缘检测有以下三种类型。


一阶微分:以一阶微分为基础的边缘检测,通过计算图像的梯度值来检测图像边缘,如Sobel算子,Prewitt算子,Roberts算子及差分边缘检测。


二阶微分:以二阶微分为基础的边缘检测,通过寻求二阶导数中的过零点来检测边缘,如拉普拉斯算子,高拉普拉斯算子,Canny算子边缘检测。


混合一阶微分和二阶微分:以混合一阶微分和二阶微分为基础的边缘检测,综合利用一阶微分和二阶微分的特征,如Marr-Hildreth边缘检测算子。


图像差分运算


差分运算通过求图像灰度变化剧烈处的一阶微分算子的极值来检测奇异点,通过奇异点的值进一步设定阈值就可以得到边缘二值化图像。差分边缘检测中差分的水平或垂直方向都与边缘方向正交,因此在实际应用场景中,常常将边缘检测分为水平边缘,垂直边缘以及对角线边缘。


代码演示:


#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
void diffOperation(const cv::Mat srcImage, cv::Mat& edgeXImage, cv::Mat& edgeYImage) {
  cv::Mat tempImage = srcImage.clone();
  int nRows = tempImage.rows;
  int nCols = tempImage.cols;
  for (int i = 0; i < nRows - 1; i++) {
    for (int j = 0; j < nCols - 1; j++) {
      //计算垂直边缘
      edgeXImage.at<uchar>(i, j) = abs(tempImage.at<uchar>(i + 1, j) - tempImage.at<uchar>(i, j));
      //计算水平边缘
      edgeYImage.at<uchar>(i, j) = abs(tempImage.at<uchar>(i, j + 1) - tempImage.at<uchar>(i, j));
    }
  }
}
int main() {
  cv::Mat srcImage = cv::imread("C:\\Users\\86173\\Desktop\\lou.jpg",0);
  if (!srcImage.data)
    return -1;
  cv::imshow("srcImage", srcImage);
  cv::Mat edgeXImage(srcImage.size(), srcImage.type());
  cv::Mat edgeYImage(srcImage.size(), srcImage.type());
  //计算差分图像
  diffOperation(srcImage, edgeXImage, edgeYImage);
  cv::imshow("edgeXImage", edgeXImage);
  cv::imshow("edgeYImage", edgeYImage);
  cv::Mat edgeImage(srcImage.size(), srcImage.type());
  //水平与垂直边缘图像叠加
  cv::addWeighted(edgeXImage, 0.5, edgeYImage, 0.5, 0.0, edgeImage);
  cv::imshow("edgeImage", edgeImage);
  cv::waitKey(0);
  return 0;
}


实现效果:


0b2a854468bb2de9dbc6dbb15016b15a_85b95e0cf2d641c4a9572ec2f4895683.jpeg

fda547196fde4f602ede3434ae54256b_fc899294ce514b7f937f1a0db8820ef6.png


总结:图像差分运算一般适用于边缘检测水平边缘,垂直边缘以及对角线边缘。


相关实践学习
基于函数计算实现AI推理
本场景基于函数计算建立一个TensorFlow Serverless AI推理平台。
相关文章
|
3天前
|
算法 计算机视觉
OpenCV高斯差分技术实现图像边缘检测
OpenCV高斯差分技术实现图像边缘检测
|
5天前
|
计算机视觉
OpenCV图像运动模糊
OpenCV图像运动模糊
9 0
|
5天前
|
计算机视觉
OpenCV图像阈值
OpenCV图像阈值
5 0
|
5天前
|
计算机视觉
OpenCV按位逻辑运算
OpenCV按位逻辑运算
6 0
|
5天前
|
计算机视觉
OpenCV图像混合
OpenCV图像混合
8 0
|
5天前
|
计算机视觉 Python
OpenCV为图像扩边(填充)
OpenCV为图像扩边(填充)
9 0
|
5天前
|
存储 C++
C/C++中的整数除法运算与汇编指令DIV和IDIV
C/C++中的整数除法运算与汇编指令DIV和IDIV
18 1
|
5天前
|
存储 安全 程序员
C/C++中的整数乘法运算与汇编指令MUL和IMUL
C/C++中的整数乘法运算与汇编指令MUL和IMUL
12 0
|
5天前
|
编译器 C++
C/C++中的逻辑运算与汇编指令的交互
C/C++中的逻辑运算与汇编指令的交互
10 0
|
5天前
|
编译器 程序员 C++
C/C++逻辑与运算与汇编指令的关系
C/C++逻辑与运算与汇编指令的关系
16 0