OpenCV——Scharr边缘检测由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。
一、Scharr算法
1、算法概述
Scharr边缘检测算法是对Sobel算子差异性的增强,因此两者在检测图像边缘的原理和使用方式上相同。Scharr算子的边缘检测滤波尺寸为3x3,因此也可称其为Scharr滤波器。可以通过将滤波器中的权重系数放大来增大像素见的差异,Scharr算子就是采用这种思想,其在X方向一阶Scharr边缘检测算子为:
[
−
3
0
3
−
10
0
10
−
3
0
3
]
(1)
\left[ \begin{matrix} -3 & 0 & 3\\ -10 & 0 & 10 \\ -3 & 0 & 3 \end{matrix} \right] \tag{1}
−3−10−30003103
(1)
Y方向一阶Scharr边缘检测算子为:
[
−
3
10
−
3
0
0
0
3
10
3
]
(2)
\left[ \begin{matrix} -3 & 10 & -3\\ 0 & 0 & 0 \\ 3 & 10 & 3 \end{matrix} \right] \tag{2}
−30310010−303
(2)
2、主要函数
void Scharr( InputArray src, OutputArray dst, int ddepth,
int dx, int dy, double scale = 1, double delta = 0,
int borderType = BORDER_DEFAULT )
-
src
:传入的图像 -
ddepth
:图像的深度,可以为-1、CV_16S、CV_32F、CV_64F。 -
dx
、dy
:指的是求导的阶数,0表示这个方向上没有求导,所填的数一般为0、1、2。 -
scale
:计算可选比例因子,默认值1 。 -
delta
:加到输出像素的偏值,默认为0 。 -
borderType
:边界类型,默认值BORDER_DEFAULT。
二、C++代码
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
//读取图像,黑白图像边缘检测结果较为明显
Mat img = imread("2.jpg", IMREAD_ANYDEPTH);
if (img.empty())
{
cout << "请确认图像文件名称是否正确" << endl;
return -1;
}
Mat resultX, resultY, resultXY;
//X方向一阶边缘
Scharr(img, resultX, CV_16S, 1, 0);
convertScaleAbs(resultX, resultX);
//Y方向一阶边缘
Scharr(img, resultY, CV_16S, 0, 1);
convertScaleAbs(resultY, resultY);
//整幅图像的一阶边缘
resultXY = resultX + resultY;
//显示图像
imshow("resultX", resultX);
imshow("resultY", resultY);
imshow("resultXY", resultXY);
waitKey(0);
return 0;
}
三、python代码
import cv2
img = cv2.imread("2.jpg")
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# -------------------Scharr边缘检测------------------------
x = cv2.Scharr(gray_img, cv2.CV_16S, 1, 0)
y = cv2.Scharr(gray_img, cv2.CV_16S, 0, 1)
# cv2.convertScaleAbs(src[, dst[, alpha[, beta]]])
# 可选参数alpha是伸缩系数,beta是加到结果上的一个值,结果返回uint类型的图像
Scharr_absX = cv2.convertScaleAbs(x) # convert 转换 scale 缩放
Scharr_absY = cv2.convertScaleAbs(y)
result = cv2.addWeighted(Scharr_absX, 0.5, Scharr_absY, 0.5, 0)
# ----------------------显示结果----------------------------
cv2.imshow('origin_img', img)
cv2.imshow('img', gray_img)
cv2.imshow('Scharr_absX', Scharr_absX)
cv2.imshow('Scharr_absY', Scharr_absY)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
四、结果展示
1、灰度图
2、X方向一阶边缘
2、Y方向一阶边缘
3、整幅图像的一阶边缘
文章来源:https://www.toymoban.com/news/detail-817413.html
五、相关链接
[1] Scharr(边缘提取)文章来源地址https://www.toymoban.com/news/detail-817413.html
到了这里,关于OpenCV——Scharr边缘检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!