应用sobel算子算法c语言,Sobel算子详解

应用sobel算子算法c语言,Sobel算子详解1、卷积应用-图像边缘提取Sobel算子是一个离散微分算子(discretedifferentiationoperator)。它结合了高斯平滑和微分求导,用来计算图像灰度函数的近似梯度。边缘是什么–是像素值发生跃迁的地方,是图像的显著特征之一图1中灰度值的”跃升”表示边缘的存在,图2中使用一阶微分求导我们可以更加清晰的看到边缘”跃升”的存在测试图片图一图二2、解析Sobel算子在…

大家好,欢迎来到IT知识分享网。

1 、卷积应用-图像边缘提取

Sobel 算子是一个离散微分算子 (discrete differentiation operator)。 它结合了高斯平滑和微分求导,用来计算图像灰度函数的近似梯度。边缘是什么 – 是像素值发生跃迁的地方,是图像的显著特征之一

图1中灰度值的”跃升”表示边缘的存在,图2中使用一阶微分求导我们可以更加清晰的看到边缘”跃升”的存在

54815ee73dcd

测试图片

54815ee73dcd

图一

54815ee73dcd

图二

2 、解析

Sobel算子在x,y两个方向求导

54815ee73dcd

image.png

54815ee73dcd

最终结果

3 、整体代码测试

对于图像的处理,基本的步骤是这样的:

取得图像数据 —— 将图像进行平滑处理 —— 进行边缘检测,阈值分析 —— 进行形态学的操作 —— 获取某些特征点 —— 分析数据

CV_EXPORTS_W void Sobel( InputArray src, OutputArray dst, int ddepth,

int dx, int dy, int ksize = 3,

double scale = 1, double delta = 0,

int borderType = BORDER_DEFAULT );

ddepth:图像的颜色深度,针对不同的输入图像,输出目标图像有不同的深度,具体组合如下:

– 若src.depth() = CV_8U, 取ddepth =-1/CV_16S/CV_32F/CV_64F

– 若src.depth() = CV_16U/CV_16S, 取ddepth =-1/CV_32F/CV_64F

– 若src.depth() = CV_32F, 取ddepth =-1/CV_32F/CV_64F

– 若src.depth() = CV_64F, 取ddepth = -1/CV_64F

dx:int类型的,表示x方向的差分阶数,1或0

dy:int类型的,表示y方向的差分阶数,1或0

kSize:模板大小,前面虽然提到过,不过对于Sobel算子这里要补充下,这里的取值为1,3,5,7,当不输入的时候,默认为3。特殊的,当kSize = 1的时候,采用的模板为1*3或者3*1 而非平时的那些格式。

CV_EXPORTS_W void Scharr( InputArray src, OutputArray dst, int ddepth,

int dx, int dy, double scale = 1, double delta = 0,

int borderType = BORDER_DEFAULT );

参数和Sobel算子一致,不过,该函数与Sobel的区别在于,Scharr仅作用于大小为3的内核。具有和sobel算子一样的速度,但结果更为精确

void cv::convertScaleAbs(

cv::InputArray src, // 输入数组

cv::OutputArray dst, // 输出数组

double alpha = 1.0, // 乘数因子

double beta = 0.0 // 偏移量

);

#include

#include

#include

using namespace cv;

int main(int argc, char** argv) {

Mat src, dst;

src = imread(“D:\\2.jpg”);

if (!src.data) {

printf(“could not load image…\n”);

return -1;

}

char INPUT_TITLE[] = “input image”;

char OUTPUT_TITLE[] = “sobel-demo”;

namedWindow(INPUT_TITLE, CV_WINDOW_AUTOSIZE);

//namedWindow(OUTPUT_TITLE, CV_WINDOW_AUTOSIZE);

imshow(INPUT_TITLE, src);

Mat gray_src;

GaussianBlur(src, dst, Size(3, 3), 0, 0);

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);

imshow(“xgrad”, xgrad);

imshow(“ygrad”, ygrad);

Mat xygrad = Mat(xgrad.size(), xgrad.type());

printf(“type : %d\n”, 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(row, col);

int yg = ygrad.at(row, col);

int xy = xg + yg;

xygrad.at(row, col) = saturate_cast(xy);

}

}

//addWeighted(xgrad, 0.5, ygrad, 0.5, 0, xygrad);

imshow(“xygrad”, xygrad);

waitKey(0);

return 0;

}

54815ee73dcd

Scharr

54815ee73dcd

Sobel

54815ee73dcd

xgrad+ygrad

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/21845.html

(0)
上一篇 2024-01-14 16:45
下一篇 2024-01-16 09:33

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信