VTK修炼之道35:边缘检测_Laplace算子
1.拉普拉斯算子
拉普拉斯算子是一个二阶边缘算子,即梯度的散度。拉普拉斯算子的实现也是通过模板实现。常用的拉普拉斯模板定义如下:
拉普拉斯算子计算图像的二阶导数,对于图像噪声比较敏感。拉普拉斯算子的结果为标量,表示边缘的宽度。但是它常产生双像素宽边缘,而且不能提供方向信息,因此较少直接用于边缘检测。在VTK中由vtkImageLaplacian实现。
#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL);#include <vtkSmartPointer.h> #include <vtkJPEGReader.h> #include <vtkImageData.h> #include <vtkImageLaplacian.h> #include <vtkImageShiftScale.h> #include <vtkImageActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkInteractorStyleImage.h>int main(int argc, char* argv[]) {vtkSmartPointer<vtkJPEGReader> reader =vtkSmartPointer<vtkJPEGReader>::New();reader->SetFileName("lena.jpg");reader->Update();vtkSmartPointer<vtkImageLaplacian> lapFilter =vtkSmartPointer<vtkImageLaplacian>::New();lapFilter->SetInputConnection(reader->GetOutputPort());lapFilter->SetDimensionality(2);double range[2];lapFilter->GetOutput()->GetScalarRange(range);vtkSmartPointer<vtkImageShiftScale> ShiftScale =vtkSmartPointer<vtkImageShiftScale>::New();ShiftScale->SetOutputScalarTypeToUnsignedChar();ShiftScale->SetScale(255 / (range[1] - range[0]));ShiftScale->SetShift(-range[0]);ShiftScale->SetInputConnection(lapFilter->GetOutputPort());ShiftScale->Update();vtkSmartPointer<vtkImageActor> originalActor =vtkSmartPointer<vtkImageActor>::New();originalActor->SetInputData(reader->GetOutput());vtkSmartPointer<vtkImageActor> gradActor =vtkSmartPointer<vtkImageActor>::New();gradActor->SetInputData(ShiftScale->GetOutput());double originalViewport[4] = { 0.0, 0.0, 0.5, 1.0 };double gradviewport[4] = { 0.5, 0.0, 1.0, 1.0 };vtkSmartPointer<vtkRenderer> originalRenderer =vtkSmartPointer<vtkRenderer>::New();originalRenderer->SetViewport(originalViewport);originalRenderer->AddActor(originalActor);originalRenderer->ResetCamera();originalRenderer->SetBackground(1.0, 1.0, 1.0);vtkSmartPointer<vtkRenderer> gradRenderer =vtkSmartPointer<vtkRenderer>::New();gradRenderer->SetViewport(gradviewport);gradRenderer->AddActor(gradActor);gradRenderer->ResetCamera();gradRenderer->SetBackground(1.0, 1.0, 1.0);vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(originalRenderer);rw->AddRenderer(gradRenderer);rw->SetSize(640, 320);rw->Render();rw->SetWindowName("Edge by Laplacian");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();vtkSmartPointer<vtkInteractorStyleImage> style =vtkSmartPointer<vtkInteractorStyleImage>::New();rwi->SetInteractorStyle(style);rwi->SetRenderWindow(renderWindow);rwi->Initialize();rwi->Start();return 0; }
vtkImageLaplacian输入和输出数据都是vtkImageData,与梯度算子不同,该filter的输出图像像素为标量。函数SetDimensionality用于设置输入图像的维数,默认为2维。计算完毕后,利用vtkImageShiftScale将图像的数据范围变换至0-255之间。
计算结果如下图所示:
2.参看资料
1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3.《The Visualization Toolkit – AnObject-Oriented Approach To 3D Graphics (4th Edition)》
4. 张晓东, 罗火灵. VTK图形图像开发进阶[M]. 机械工业出版社, 2015.
VTK修炼之道35:边缘检测_Laplace算子相关推荐
- VTK修炼之道33:边缘检测_Sobel算子
1.Sobel算子用于提取图像边缘 Sobel算子也是一种常用的梯度算子.Sobel算子计算稍微复杂,它采用3x3的模板.计算时模板在图像上移动,并在每个位置上计算对应中心像素的梯度值. VTK中vt ...
- VTK修炼之道32:边缘检测_梯度算子
1.梯度算子提取图像边缘 图像中不连续的灰度值会产生边缘,图像的边缘检测是基于边界的图像分割方法,如分水岭算法,通常是分割原图的梯度图像,梯度实际上也是反应的图像边缘信息.图像边缘一般常用图像一阶导数 ...
- VTK修炼之道34:边缘检测_Canny算子
1.Canny算子 Canny算子是John Canny于20世纪80年代提出的一种多级边缘检测算法.John Canny研究了最优边缘的特性,即检测到的边缘要尽可能跟实际的边缘接近并尽可能的多,同时 ...
- VTK修炼之道54:图形基本操作进阶_表面重建技术(三角剖分)
1.表面重建 通过三维扫描仪所获取的实际物体的空间点云数据仅仅表示物体的几何形状,而无法表达其内部的拓扑结构.拓扑结构对于实际图形处理以及可视化具有更重要的意义.因此,这就需要利用表面重建技术奖点云数 ...
- VTK修炼之道53:图形基本操作进阶_多分辨率策略(模型细化的三种方法)
1.模型细化 vtk中实现网格细化的累有vtkLinearSubdivisionFilter.vtkLoopsubdivisionFilter.vtkButterflySubdivisionFilte ...
- VTK修炼之道39:图像平滑_各向异性滤波
1.各向异性扩散滤波 高斯平滑方法在平滑噪声的同时,模糊了图像的重要边缘图像. 各向异性滤波是一种基于偏微分方程的滤波技术,建立于热量的各向异性扩散理论. 各向异性滤波在图像的平坦区域选择大尺度平滑, ...
- VTK修炼之道20:图像基本操作_图像类型转换
1.vtkImageCast 图像数据类型转换在数字图像处理中会被频繁地用到.一些常用到的图像算子(例如梯度算子)在计算时出于精度的考虑,会将结果存储为float或者double类型.但是在图像显示时 ...
- python VTK(十三) ----图像边缘检测 梯度算子 sobel算子
梯度算子 import vtk reader = vtk.vtkJPEGReader() # 读入灰度图 reader.SetFileName(r'E:\lena-gray.jpg') reader. ...
- VTK修炼之道83:Pipeline管线执行模型
1.管线执行模性 请求是VTK执行管线的一个基本操作,一个管线执行模型由多个请求共同完成.管线建立完毕,当显示调用一个Filter的Update()函数时,该Filter的vtkExecutive子类 ...
最新文章
- Java图片,视频上传,截取视频帧以及文件下载和视频IO获取
- C语言 数字翻转输出
- SaaS CRM系统存在的五大安全漏洞
- wizard generated application - how is detail page rendered
- blender使用_使用Blender准备骨科手术
- 数据:以太坊上借贷协议资金规模年内增长幅度超300%
- js 父子标签同时设置onclick,字标签触发父标签onclick解决办法
- Unity,基于layer的碰撞配置
- HDU 5857 - Median ( 查询模拟 + 思路 )
- 怎样才能容易更换DB
- Matlab趋势线公式引用,批量提取excel中图表趋势线的公式中的斜率 - 程序语言 - 小木虫 - 学术 科研 互动社区...
- JAVA实现商品信息管理系统
- 医学计算机ppt模板,计算机与医学.ppt
- python的setting怎么找_python基础之setting设置,变量和关键字
- TF-IDF算法详解与应用
- c语言创建一个bat文件内容,基础教程:如何创建批处理文件
- matlab 直接逆滤波,图像复原之直接逆滤波
- linux命令之head、tail命令具体解释
- 用PS制作公路上的逼真文字
- 【ps功能精通】4.简单背景图片抠图