1.Sobel算子用于提取图像边缘

Sobel算子也是一种常用的梯度算子。Sobel算子计算稍微复杂,它采用3x3的模板。计算时模板在图像上移动,并在每个位置上计算对应中心像素的梯度值。
VTK中vtkSobel2D计算图像的sobel算子,使用代码如下:
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);#include <vtkSmartPointer.h>
#include <vtkJPEGReader.h>
#include <vtkImageSobel2D.h>
#include <vtkImageExtractComponents.h>
#include <vtkImageMathematics.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("lena.jpg");reader->Update();vtkSmartPointer<vtkImageSobel2D> sobelFilter =vtkSmartPointer<vtkImageSobel2D>::New();sobelFilter->SetInputConnection(reader->GetOutputPort());//包含横向和竖向边缘//提取X向边缘成分vtkSmartPointer<vtkImageExtractComponents> xSobel =vtkSmartPointer<vtkImageExtractComponents>::New();xSobel->SetComponents(0);//提取第一成分即X向梯度xSobel->SetInputConnection(sobelFilter->GetOutputPort());xSobel->Update();vtkSmartPointer<vtkImageMathematics> absFilter =vtkSmartPointer<vtkImageMathematics>::New();absFilter->SetOperationToAbsoluteValue();//将属性设置为绝对值模式absFilter->SetInputConnection(xSobel->GetOutputPort());absFilter->Update();double xRange[2];absFilter->GetOutput()->GetScalarRange(xRange);vtkSmartPointer<vtkImageShiftScale> xShiftScale =vtkSmartPointer<vtkImageShiftScale>::New();xShiftScale->SetOutputScalarTypeToUnsignedChar();//强制类型转换 方便显示xShiftScale->SetScale(255 / xRange[1]);//设置属性xShiftScale->SetInputConnection(absFilter->GetOutputPort());xShiftScale->Update();//提取Y向边缘成分vtkSmartPointer<vtkImageExtractComponents> ySobel =vtkSmartPointer<vtkImageExtractComponents>::New();ySobel->SetComponents(1);ySobel->SetInputConnection(sobelFilter->GetOutputPort());ySobel->Update();vtkSmartPointer<vtkImageMathematics> absYsobel =vtkSmartPointer<vtkImageMathematics>::New();absYsobel->SetOperationToAbsoluteValue();absYsobel->SetInputConnection(ySobel->GetOutputPort());absYsobel->Update();double yRange[2];absYsobel->GetOutput()->GetScalarRange(yRange);vtkSmartPointer<vtkImageShiftScale> yShiftScale =vtkSmartPointer<vtkImageShiftScale>::New();yShiftScale->SetOutputScalarTypeToUnsignedChar();yShiftScale->SetScale(255 / yRange[1]);yShiftScale->SetInputConnection(absYsobel->GetOutputPort());yShiftScale->Update();vtkSmartPointer<vtkImageActor> origActor =vtkSmartPointer<vtkImageActor>::New();origActor->SetInputData(reader->GetOutput());vtkSmartPointer<vtkImageActor> xSobelActor =vtkSmartPointer<vtkImageActor>::New();xSobelActor->SetInputData(xShiftScale->GetOutput());vtkSmartPointer<vtkImageActor> ySobelActor =vtkSmartPointer<vtkImageActor>::New();ySobelActor->SetInputData(yShiftScale->GetOutput());/double origView[4] = { 0, 0, 0.33, 1 };double xSobelView[4] = { 0.33, 0, 0.66, 1 };double ySobelView[4] = { 0.66, 0, 1, 1 };vtkSmartPointer<vtkRenderer> origRender =vtkSmartPointer<vtkRenderer>::New();origRender->SetViewport(origView);origRender->AddActor(origActor);origRender->ResetCamera();origRender->SetBackground(1, 0, 0);vtkSmartPointer<vtkRenderer> xSobelRender =vtkSmartPointer<vtkRenderer>::New();xSobelRender->SetViewport(xSobelView);xSobelRender->AddActor(xSobelActor);xSobelRender->ResetCamera();xSobelRender->SetBackground(0, 1, 0);vtkSmartPointer<vtkRenderer> ySobelRender =vtkSmartPointer<vtkRenderer>::New();ySobelRender->SetViewport(ySobelView);ySobelRender->AddActor(ySobelActor);ySobelRender->ResetCamera();ySobelRender->SetBackground(0, 0, 1);//vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(origRender);rw->AddRenderer(xSobelRender);rw->AddRenderer(ySobelRender);rw->SetSize(960, 320);rw->SetWindowName("Edge by Soebl");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();vtkSmartPointer<vtkInteractorStyleImage> style =vtkSmartPointer<vtkInteractorStyleImage>::New();rwi->SetInteractorStyle(style);rwi->SetRenderWindow(rw);rwi->Initialize();rwi->Start();return 0;
}

该例中计算利用Sobel算子计算图像的梯度图像,然后提取X方向的梯度分量和Y方向的梯度分量。

由于计算Sobel算子的值可能存在负值,因此利用vtkImageMathematics对各个分量图像计算绝对值,再由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修炼之道33:边缘检测_Sobel算子相关推荐

  1. VTK修炼之道35:边缘检测_Laplace算子

    1.拉普拉斯算子 拉普拉斯算子是一个二阶边缘算子,即梯度的散度.拉普拉斯算子的实现也是通过模板实现.常用的拉普拉斯模板定义如下: 拉普拉斯算子计算图像的二阶导数,对于图像噪声比较敏感.拉普拉斯算子的结 ...

  2. VTK修炼之道32:边缘检测_梯度算子

    1.梯度算子提取图像边缘 图像中不连续的灰度值会产生边缘,图像的边缘检测是基于边界的图像分割方法,如分水岭算法,通常是分割原图的梯度图像,梯度实际上也是反应的图像边缘信息.图像边缘一般常用图像一阶导数 ...

  3. VTK修炼之道34:边缘检测_Canny算子

    1.Canny算子 Canny算子是John Canny于20世纪80年代提出的一种多级边缘检测算法.John Canny研究了最优边缘的特性,即检测到的边缘要尽可能跟实际的边缘接近并尽可能的多,同时 ...

  4. python VTK(十三) ----图像边缘检测 梯度算子 sobel算子

    梯度算子 import vtk reader = vtk.vtkJPEGReader() # 读入灰度图 reader.SetFileName(r'E:\lena-gray.jpg') reader. ...

  5. VTK修炼之道53:图形基本操作进阶_多分辨率策略(模型细化的三种方法)

    1.模型细化 vtk中实现网格细化的累有vtkLinearSubdivisionFilter.vtkLoopsubdivisionFilter.vtkButterflySubdivisionFilte ...

  6. VTK修炼之道47:图形基本操作进阶_法向量计算

    1.点法向量和单元法向量 三维平面的法向量是指垂直于该平面的三维向量.曲面在某点P处的法向量为垂直于该点切平面的向量.对于一个网格模型,其每一个点和单元都可以计算一个法向量,在三维计算机图形学中法向量 ...

  7. VTK修炼之道40:频域处理_快速傅里叶变换及其反变换1

    1.图像频域处理的意义 在图像处理和分析中,经常会将图像从图像空间转换到其他空间中,并利用这些空间的特点进行对转换后图像进行分析处理,然后再将处理后的图像转换到图像空间中,这称之为图像变换. 在一些图 ...

  8. VTK修炼之道39:图像平滑_各向异性滤波

    1.各向异性扩散滤波 高斯平滑方法在平滑噪声的同时,模糊了图像的重要边缘图像. 各向异性滤波是一种基于偏微分方程的滤波技术,建立于热量的各向异性扩散理论. 各向异性滤波在图像的平坦区域选择大尺度平滑, ...

  9. VTK修炼之道20:图像基本操作_图像类型转换

    1.vtkImageCast 图像数据类型转换在数字图像处理中会被频繁地用到.一些常用到的图像算子(例如梯度算子)在计算时出于精度的考虑,会将结果存储为float或者double类型.但是在图像显示时 ...

最新文章

  1. 微软职位内部推荐-Senior Software Engineer
  2. 减少访问量_Lazada:唯一一个访问量明显着下降、出现负增长10%的玩家
  3. ssas 为绑定指定的大小太小,导致一个或多个列值被截断
  4. 指定jdk8_动图+源码+总结:深度解析 JDK8 中的数据结构(珍藏版)
  5. C++ 术语(C++ Primer)
  6. 排序算法 —— 归并排序
  7. php断点调试的几种方法
  8. 【Pytorch神经网络基础理论篇】 04 线性代数
  9. 基本类型与字符串的相互转换
  10. 华为Mate 30系列将升级25W无线快充:充电方面无对手
  11. 十年前乔布斯曾试图颠覆电视行业 如今苹果终于出手了
  12. 前端为什么要工程化?
  13. 易语言下载别人的源码编译出来用不了_我是如何阅读源码的
  14. 添加服务oracle,oracle 11g(四)给oracle添加为系统服务(脚本)
  15. 利用workbench建立的响应面模型质量很差,该如何解决?求指点
  16. 知识图谱+Recorder︱中文知识图谱API与工具、科研机构与算法框架
  17. Sniffer网络监视功能
  18. win10 win+shift+s 截图存哪里去了
  19. c语言10以内的加法程序代码,怎样用c语言编写个能随机出10以内加减法题目的程序...
  20. php音乐网站论文,PHP音乐交流论坛的设计与实现毕业设计

热门文章

  1. ANDROID L——Material Design综合应用(Demo)
  2. 应用DOM操作文档的一个实用例子
  3. 【转】WSS3.0开发--你还在为写CAML痛苦吗?
  4. Linux文本模式中文乱码
  5. hdu 5155(DP+排列组合)
  6. strcat()的实现
  7. 数据结构(严蔚敏)之一——顺序表之c语言实现
  8. steps/align_si.sh
  9. NSNumber 以及NSInteger,NSNumber以及Int的区别
  10. 如何建立软件测试管理体系?