zoukankan      html  css  js  c++  java
  • OpenCV——边缘检测(sobel算子、Laplacian算子、scharr滤波器)

     1 #include <opencv2/opencv.hpp>
     2 #include <iostream>
     3 
     4 using namespace cv;
     5 using namespace std;
     6 
     7 
     8 int main(int argc, char** argv)
     9 {
    10     Mat src = imread("test.jpg");
    11     Mat dst, gray,grad_x, gray_y,abs_grad_x,abs_grad_y;
    12 
    13 
    14     //转成灰度图
    15     cvtColor(src, gray, COLOR_BGR2GRAY);
    16 
    17     //均值滤波降噪,也可以用其他滤波方法
    18     blur(gray, src, Size(3, 3));
    19 
    20     //运行Sobel算子,得到边缘
    21     //求x方向梯度
    22     Sobel(src, grad_x, CV_16S, 1, 0, 3);
    23     convertScaleAbs(grad_x, abs_grad_x);//提取的深度图片进行显示时,由于是16位图片,要将图片转化成为8位图形进行显示 
    24     imshow("x方向的sobel", abs_grad_x);
    25 
    26     //运行Sobel算子,得到边缘
    27     //求y方向梯度
    28     Sobel(src, gray_y, CV_16S, 0, 1, 3);
    29     convertScaleAbs(gray_y, abs_grad_y);
    30     imshow("y方向的sobel", abs_grad_y);
    31 
    32     //合并梯度
    33     addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst);
    34 
    35 
    36     imshow("合成的整体效果图", dst);
    37     
    38     waitKey(0);
    39     return 0;
    40 
    41 }

     convertScaleAbs函数
    线性变换转换输入数组元素成8位无符号整型。
    void convertScaleAbs(InputArray src, OutputArray dst, double alpha=1, double beta=0)
    参数 :
    src – 输入数组。
    dst – 输出数组。
    alpha – 可选缩放比例常数。
    beta – 可选叠加到结果的常数。
    对于每个输入数组的元素函数convertScaleAbs 进行三次操作依次是:缩放,得到一个绝对值,转换成无符号8位类型。
    对于多通道矩阵,该函数对各通道独立处理。如果输出不是8位,将调用Mat::convertTo 方法并计算结果的绝对值。

    addWeighted函数
    计算两个矩阵的加权和。
    void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, intdtype=-1)
    参数 
    src1 – 第一个输入数组。
    alpha – 第一个数组的加权系数。
    src2 – 第二个输入数组,必须和第一个数组拥有相同的大小和通道。
    beta – 第二个数组的加权系数。
    dst – 输出数组,和第一个数组拥有相同的大小和通道。
    gamma – 对所有和的叠加的常量。
    dtype – 输出数组中的可选的深度,当两个数组具有相同的深度,此系数可设为-1,意义等同于选择与第一个数组相同的深度。
    在多通道情况下,每个通道是独立处理的,该函数可以被替换成一个函数表达式:
    dst = src1*alpha + src2*beta + gamma;

     

     1 #include <opencv2/opencv.hpp>
     2 #include <iostream>
     3 
     4 using namespace cv;
     5 using namespace std;
     6 
     7 
     8 int main(int argc, char** argv)
     9 {
    10     Mat src = imread("test.jpg");
    11     Mat dst, gray;
    12 
    13     //滤波降噪
    14     GaussianBlur(src, src, Size(3, 3),0,0,BORDER_DEFAULT);
    15 
    16     //转成灰度图
    17     cvtColor(src, gray, COLOR_BGR2GRAY);
    18 
    19     //运行Sobel算子,得到边缘
    20     //求x方向梯度
    21     //Laplacian(src, dst, CV_16S, 3, 1,0,BORDER_DEFAULT);
    22     Laplacian(src, dst, CV_16S);//后几个参数有默认值
    23 
    24     //由于是16位图片,需要将图片转化成为8位图形进行显示 
    25     convertScaleAbs(dst, dst);
    26         
    27     imshow("效果图", dst);
    28     
    29     waitKey(0);
    30     return 0;
    31 
    32 }

     

     1 #include <opencv2/opencv.hpp>
     2 #include <iostream>
     3 
     4 using namespace cv;
     5 using namespace std;
     6 
     7 
     8 int main(int argc, char** argv)
     9 {
    10     Mat src = imread("test.jpg");
    11     Mat dst, gray,grad_x, grad_y,abs_grad_x,abs_grad_y;
    12 
    13     
    14     //转成灰度图(sobel和scharr可以不用转换成灰度图)
    15     cvtColor(src, gray, COLOR_BGR2GRAY);
    16 
    17     //均值滤波降噪,也可以用其他滤波方法
    18     blur(gray, src, Size(3, 3));
    19 
    20     //运行Sobel算子,得到边缘
    21     //求x方向梯度
    22     Scharr(src, grad_x, CV_16S, 1, 0);
    23     convertScaleAbs(grad_x, abs_grad_x);//提取的深度图片进行显示时,由于是16位图片,想将图片转化成为8位图形进行显示 
    24     imshow("x方向的Scharr", abs_grad_x);
    25 
    26     //运行Sobel算子,得到边缘
    27     //求y方向梯度
    28     Scharr(src, grad_y, CV_16S, 0, 1);
    29     convertScaleAbs(grad_y, abs_grad_y);
    30     imshow("y方向的Scharr", abs_grad_y);
    31 
    32     //合并梯度
    33     addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst);
    34 
    35 
    36     imshow("合成的整体效果图", dst);
    37     
    38     waitKey(0);
    39     return 0;
    40 
    41 }
  • 相关阅读:
    selenium+python常用函数
    不同网络层的协议与工具
    Loudrunner编写WinSocket接口测试脚本
    python常见问题汇总
    Appium简介及工作原理
    Http协议详解
    Selenium 工作原理
    HTTP与HTTPS有哪些区别?
    【Appium】Appium工作原理(2)
    MySQL 必知必会学习笔记(常用命令二)
  • 原文地址:https://www.cnblogs.com/long5683/p/9675691.html
Copyright © 2011-2022 走看看