笔记:OpenCV4.5.4 【c++】Sobel算子和Laplance算子

该文详细介绍了使用OpenCV库进行图像处理,包括Sobel和Laplacian算子在边缘检测中的应用。首先通过高斯模糊去除噪声,然后将图像转换为灰度图,接着利用Sobel算子或Scharr算子进行X和Y方向的梯度计算,结合拉普拉斯算子进行二阶导数计算,以提取图像边缘。最后,通过取绝对值、阈值处理和形态学操作优化边缘效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

Sobel算子

Laplance算子 

处理流程 


Sobel算子

cv::Sobel ( InputArray Src // 输入图像 OutputArray dst// 输出图像,大小与输入图像一致 int depth // 输出图像深度. Int dx.  // X方向,几阶导数 int dy // Y方向,几阶导数. int ksize, SOBEL算子kernel大小,必须是1、3、5、7、 double scale  = 1 double delta = 0 int borderType = BORDER_DEFAULT )

cv::Scharr ( InputArray Src // 输入图像 OutputArray dst// 输出图像,大小与输入图像一致 int depth // 输出图像深度. Int dx.  // X方向,几阶导数 int dy // Y方向,几阶导数. double scale  = 1 double delta = 0 int borderType = BORDER_DEFAULT )

#include<iostream>
#include<opencv2/opencv.hpp>
#include<cmath>

    using namespace std;
    using namespace cv;
    Mat src, dst, gray_src, temp;
    int main() 
    {
        src = imread("D:/opencv/2/a.jpg");
        if (!src.data) 
        {
            printf("could not load image...\n");
            return -1;
        }
        imshow("input", src);
        //高斯模糊,进行降噪
        GaussianBlur(src, temp, Size(3, 3), 0, 0, BORDER_DEFAULT);
        //转灰度图
        cvtColor(temp, gray_src, COLOR_BGR2GRAY);

        Mat xgrad, ygrad;
        //Sobel算子 -1 0 1 -2 0 2 -1 0 1
        Sobel(gray_src, xgrad, CV_16S, 1, 0, 3);
        Sobel(gray_src, ygrad, CV_16S, 0, 1, 3);
        //opencv改进算法 Scharr算子 -3 0 3 -10 0 10 -3 0 -3    优势 降低噪点带来的影响
      // Scharr(gray_src,xgrad,CV_16S,1,0);
      //  Scharr(gray_src,ygrad,CV_16S,0,1);
        //将像素点限制在0-255之间  进行绝对值
        convertScaleAbs(xgrad, xgrad);
        convertScaleAbs(ygrad, ygrad);
        //混合处理                                              //对融合后的像素值额外添加rgb值
        add(xgrad, ygrad, dst);
        imshow("output1", dst);

        addWeighted(xgrad, 0.5, ygrad, 0.5, 0, dst);
        imshow("output2", dst);
        dst = Mat(xgrad.size(), xgrad.type());
        int rows = xgrad.rows;
        int cols = xgrad.cols;

        for (int row = 0; row < rows; row++) {
            for (int col = 0; col < cols; col++) {
                int x = xgrad.at<uchar>(row, col);
                int y = ygrad.at<uchar>(row, col);
                dst.at<uchar>(row, col) = saturate_cast<uchar>(sqrt(x * x + y * y));
            }
        }

        imshow("output3", dst);

        waitKey(0);
        return 0;
    }

Laplance算子 

处理流程 

高斯模糊 – 去噪声GaussianBlur()

转换为灰度图像cvtColor()

拉普拉斯 – 二阶导数计算Laplacian()

取绝对值convertScaleAbs()

显示结果 

cv::Laplacian( InputArray src, OutputArray dst, int depth, //深度CV_16S int kisze, // 3 double scale = 1, double delta =0.0, int borderType = 4 ) 

#include<iostream>
#include<opencv2/opencv.hpp>
#include<cmath>

using namespace std;
using namespace cv;
Mat src,dst,gray_src,temp;
int main(){
    src=imread("img/2.jpg");
    if(!src.data){
        printf("could not load image...\n");
        return -1;
    }
    imshow("input",src);
    GaussianBlur(src,temp,Size(3,3),0,0);
    cvtColor(temp,gray_src,COLOR_BGR2GRAY);

    //拉普拉斯算子 用于边缘提取
    Laplacian(gray_src,dst,CV_16S,3);
    //取像素点的绝对值
    convertScaleAbs(dst,dst);

    threshold(dst,dst,0,255,THRESH_OTSU | cv::THRESH_BINARY);

    Mat kernel= getStructuringElement(MORPH_RECT,Size(7,7),Point(-1,-1));
    Mat kernel1= getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));

    morphologyEx(dst,dst,MORPH_CLOSE,kernel,Point(-1,-1));
    morphologyEx(dst,dst,MORPH_OPEN,kernel1,Point(-1,-1));
    morphologyEx(dst,dst,MORPH_CLOSE,(getStructuringElement(MORPH_RECT,Size(5,5),Point(-1,-1))),Point(-1,-1));

    imshow("laplacian",dst);

    waitKey(0);
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值