5.4.1边缘检测—梯度算子

更新时间:2023-06-17 09:04:31 阅读: 评论:0

边塞的古诗5.4.1边缘检测—梯度算⼦
图像中不连续的灰度值会产⽣边缘,图像的边缘检测是基于边界的图像分割⽅法,如分⽔岭算法,通常是分割原图的梯度图像,梯度实际上
也是反应的图像边缘信息。图像边缘⼀般常⽤图像⼀阶导数和⼆阶导数来检测。
梯度算⼦对应于图像⼀阶导数。图像⼀阶导数计算⼀般是通过差分运算来近似的。VTK中可以使⽤vtkImageGradient计算图像梯度。注意
图像梯度是⼀个向量,具有⽅向和⼤⼩。因此vtkImageGradient的计算结果是⼀个梯度场,也就是每个像素值都是⼀个梯度向量。显⽰梯
度图像时需要计算每个像素点的梯度⼤⼩,即模值。
下⾯代码如何利⽤VTK怎么计算图像梯度:
//梯度算⼦
#include"vtkSmartPointer.h"
#include"vtkJPEGReader.h"
#include"vtkImageGradient.h"
#include"vtkImageMagnitude.h"爱好的反义词
#include"vtkImageData.h"
他夏了夏天吉他谱#include"vtkImageShiftScale.h"
#include"vtkImageActor.h"
#include"vtkRenderer.h"
#include"vtkRenderWindow.h"
#include"vtkRenderWindowInteractor.h"
#include"vtkInteractorStyleImage.h"
int main()
{
vtkSmartPointer<vtkJPEGReader> reader = vtkSmartPointer<vtkJPEGReader>::New();
reader->SetFileName("data\\lena-gray.jpg");
reader->Update();
海参鸡汤的做法
vtkSmartPointer<vtkImageGradient> imgGradient = vtkSmartPointer<vtkImageGradient>::New();//vtkImageGradient计算图像梯度,是⼀个⽮量
imgGradient->SetInputConnection(reader->GetOutputPort());
imgGradient->SetDimensionality(2);//SetDimensionality⽤于要计算的图像的维数
vtkSmartPointer<vtkImageMagnitude> imgMagnitude = vtkSmartPointer<vtkImageMagnitude>::New();//imgMagnitude⽤于计算梯度⽮量的2范数(模),⽮量不能 imgMagnitude->SetInputConnection(imgGradient->GetOutputPort());
imgMagnitude->Update();
明天一定
double Range[2];
vtkSmartPointer<vtkImageData> getRange = vtkSmartPointer<vtkImageData>::New();
imgMagnitude->GetOutput()->GetScalarRange(Range);//图像灰度范围最⼩值、最⼤值
vtkSmartPointer<vtkImageShiftScale> imgShiftScale = vtkSmartPointer<vtkImageShiftScale>::New();//vtkImageShiftScale调整图像的数据范围为[0,255]
imgShiftScale->SetOutputScalarTypeToUnsignedChar(); //强制类型转换 0~255
imgShiftScale->SetScale(255 / Range[1]); //灰度映射间距
imgShiftScale->SetInputConnection(imgMagnitude->GetOutputPort());
imgShiftScale->Update();
/
vtkSmartPointer<vtkImageActor> origActor = vtkSmartPointer<vtkImageActor>::New();
origActor->SetInputData(reader->GetOutput());
vtkSmartPointer<vtkImageActor> GradientActor = vtkSmartPointer<vtkImageActor>::New();
GradientActor->SetInputData(imgShiftScale->GetOutput());
double origView[4] = { 0, 0, 0.5, 1 };
double gradientView[4] = { 0.5, 0, 1, 1 };
vtkSmartPointer<vtkRenderer> origRender = vtkSmartPointer<vtkRenderer>::New();
origRender->SetViewport(origView);
origRender->AddActor(origActor);
origRender->RetCamera();
origRender->SetBackground(1.0, 1, 1);
vtkSmartPointer<vtkRenderer> gradientRender = vtkSmartPointer<vtkRenderer>::New();
gradientRender->SetViewport(gradientView);
gradientRender->AddActor(GradientActor);爱出汗是怎么回事
gradientRender->RetCamera();
gradientRender->SetBackground(1, 1, 1);
vtkSmartPointer<vtkRenderWindow> rw = vtkSmartPointer<vtkRenderWindow>::New();
rw->AddRenderer(origRender);
rw->AddRenderer(gradientRender);
rw->SetSize(640, 320);
rw->SetWindowName("Image Gradient");
vtkSmartPointer<vtkRenderWindowInteractor> rwi = vtkSmartPointer<vtkRenderWindowInteractor>::New();
vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New();
从心开始
rwi->SetRenderWindow(rw);
rwi->SetInteractorStyle(style);
rwi->Initialize();
rwi->Start();
return 0;
}
执⾏结果如图所⽰:
vtkImageGradient的使⽤⽐较简单,只需要设置输⼊图像即可。
计算梯度时,采⽤的是中间差分法,即像素在每个⽅向的差分,都是利⽤的前后两个像素值之差。这
样在图像在边界处的差分计算需要特殊处理。其内部定义了HandleBoundaries变量,通过函数SetHandleBoundaries()定赋值。当HandleBoundaries为真时算⼦会特殊处理计算边界像素的梯度;当为假时不计算边界像素的梯度值,因此输出图像⼤⼩要⼩于输⼊图像。
另外函数SetDimensionality()⽤于设置要计算的图像维数,默认为⼆维,此时梯度向量也为⼆维。
前⾯也提到过,梯度是⼀个向量,不能直接显⽰。圣马可教堂
因此上⾯代码中定义了vtkImageMagnitude对象来计算梯度向量的2范数,即向量的模。
利⽤vtkImageShiftScale将图像的数据范围调整到0-255然后显⽰。
另外还可以通过vtkImageExtractComponents来提取每个⽅向的梯度分量进⾏显⽰。
注意,彩⾊图像不能直接⽤来计算梯度,需要先转换为灰度图像。
参考资料:
1.《The Visualization Toolkit – AnObject-Oriented Approach To 3D Graphics (4th Edition)》
2. 张晓东, 罗⽕灵. VTK图形图像开发进阶[M]. 机械⼯业出版社, 2015.
所⽤软件:vtk7.0+visual studio 2013
注:此⽂知识学习笔记,仅记录完整程序和实现结果,具体原理参见:

本文发布于:2023-06-17 09:04:31,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1042268.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:图像   梯度   计算   边缘   边界   向量   需要
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图