opencv_Sobel算子

卷积的应用

图像边缘提取

在这里插入图片描述

  • 边缘:是像素值发生跃迁的地方,是图像的显著特征之一,在图像特的显著特征之一,在图像特诊提取、对象检测、模式识别等方面都有重要的作用。
  • 捕捉/提取边缘:对图像求它的一阶导数 delta=f(x)-f(x-1),delta越大,说明像素在X方向变化越大,边缘信号越强。
Sobel算子
  • 是离散微分算子,用来计算图像灰度的近似梯度
  • Soble算子功能集合高斯平滑和微分求导
  • 又被称为一阶微分算子,求导算子,在水平和垂直两个方向上求导,得到图像X方法于Y方法梯度图像。
    在这里插入图片描述
  • 求导的近似值,kernel=3时不是很准确,OpenCV使用改进版本Scharr函数,算子如下:
    在这里插入图片描述
API说明
  • CV::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
cv::Scharr(
InputArray Src,//输入图像
OutputArray dst,//输出图像,大小与输入图像一致
int depth,//输出图像深度
int dx,//X方向,几阶导数
int dy,//Y方向,几阶导数
double scale=1,
double delta=0,
int borderType=BORDER_DEFAULT
)
其他API
  • GaussianBlur(src,dst,Size(3,3),0,0,BORDER_DEFAULT);

  • cvtColor(src,gray,COLOR_RGB2GRAY);

  • addWeighted(A,0.5,B,0.5,0,AB);

  • convertScaleAbs(A,B)//计算图像A的像素绝对值,输出到图像B

    dst(I)=saturate\_cast<ucahr>(|src(I)*alpha+beta|)
    
代码

实现:
在这里插入图片描述

#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>

using namespace cv;
int main(int argc,char** argv){
	Mat src,dst;
	src=imread("E:/opencv/zzz/hbz.jpg");
	if(!src.data){
		printf("could not load image...\n");
		return -1;
	}

	char INPUT_TITLE[]="input image";
	char OUTPUT_TITLE[]="Final Result";
	namedWindow(INPUT_TITLE,CV_WINDOW_AUTOSIZE);
	namedWindow(OUTPUT_TITLE,CV_WINDOW_AUTOSIZE);
	imshow(INPUT_TITLE,src);

	GaussianBlur(src,dst,Size(3,3),0,0);
	Mat gray_src;
	cvtColor(dst,gray_src,CV_BGR2GRAY);
	imshow("gray image",gray_src);

	Mat xgrad,ygrad;
	Scharr(gray_src,xgrad,CV_16S,1,0);
	Scharr(gray_src,ygrad,CV_16S,0,1);
	//Sobel(gray_src,xgrad,CV_16S,1,0,3);
	//Sobel(gray_src,ygrad,CV_16S,0,1,3);
	convertScaleAbs(xgrad,xgrad);
	convertScaleAbs(ygrad,ygrad);

	/*
	Sobel(gray_src,xgrad,-1,1,0,3);
	Sobel(gray_src,ygrad,-1,0,1,3);*/

	imshow("xgrad",xgrad);
	imshow("ygrad",ygrad);

	/*
	Mat xygrad;
	addWeighted(xgrad,0.5,ygrad,0.5,0,xygrad);
	imshow("Final Result",xygrad);*/
	Mat xygrad=Mat(xgrad.size(),xgrad.type());
	printf("type:%d",xgrad.type());
	int width=xgrad.cols;
	int height=ygrad.rows;
	for(int row=0;row<height;row++){
		for(int col=0;col<width;col++){
			int xg=xgrad.at<uchar>(row,col);
			int yg=ygrad.at<uchar>(row,col);
			int xy=xg+yg;
			xygrad.at<uchar>(row,col)=saturate_cast<uchar>(xy);
		}
	}
	imshow(OUTPUT_TITLE,xygrad);

	waitKey(0);
	return 0;
}
显示

在这里插入图片描述
注:笔记来源观看此教程的记录:https://www.bilibili.com/video/BV1Q54y1z7kz?p=18

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值