Canny边缘检测


开发环境:

  1. Windows 11 家庭中文版
  2. Microsoft Visual Studio Community 2019
  3. VTK-9.3.0.rc0
  4. vtk-example

demo解决问题:实现了Canny边缘检测算法的图像处理过程。

图像处理过程:

  1. 亮度提取(vtkImageLuminance)
  2. 图像类型转换(vtkImageCast)
  3. 图像平滑(vtkImageGaussianSmooth)
  4. 图像梯度计算(vtkImageGradient)
  5. 图像梯度幅值计算(vtkImageMagnitude)
  6. 非极大值抑制(vtkImageNonMaximumSuppression)
  7. 在处理完图像后,将得到的图像数据转换为vtkStructuredPoints类型,并进行边缘连接、阈值处理、几何滤波等操作。最后将处理结果添加到边缘渲染器中。最后,通过交互器进行初始化和渲染。

canny边缘提取的相关学习内容了以从这里了解下:

[Python图像处理] 四十二.Python图像锐化及边缘检测万字详解(Roberts、Prewitt、Sobel、Laplacian、Canny、LOG)
边缘监测算子
在这里插入图片描述


prj name: CannyEdgeDetector

#include <vtkCamera.h>
#include <vtkGeometryFilter.h>
#include <vtkImageActor.h>
#include <vtkImageCast.h>
#include <vtkImageConstantPad.h>
#include <vtkImageGaussianSmooth.h>
#include <vtkImageGradient.h>
#include <vtkImageLuminance.h>
#include <vtkImageMagnitude.h>
#include <vtkImageNonMaximumSuppression.h>
#include <vtkImageToStructuredPoints.h>
#include <vtkLinkEdgels.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPNGReader.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkStripper.h>
#include <vtkSubPixelPositionEdgels.h>
#include <vtkThreshold.h>int main(int argc, char* argv[])
{vtkNew<vtkNamedColors> colors;if (argc != 2){std::cerr << "Required args: filename.png e.g. Gourds.png" << std::endl;return EXIT_FAILURE;}std::string filename = argv[1];std::cout << filename << std::endl;// Define viewport ranges// (xmin, ymin, xmax, ymax)double originalViewport[4] = {0.0, 0.0, 0.5, 1.0};double edgeViewport[4] = {0.5, 0.0, 1.0, 1.0};vtkNew<vtkRenderer> originalRenderer;originalRenderer->SetViewport(originalViewport);originalRenderer->SetBackground(colors->GetColor3d("SlateGray").GetData());vtkNew<vtkRenderer> edgeRenderer;edgeRenderer->SetViewport(edgeViewport);edgeRenderer->SetBackground(colors->GetColor3d("LightSlateGray").GetData());vtkNew<vtkRenderWindow> renderWindow;renderWindow->SetSize(600, 300);renderWindow->SetMultiSamples(0);renderWindow->AddRenderer(originalRenderer);renderWindow->AddRenderer(edgeRenderer);renderWindow->SetWindowName("CannyEdgeDetector");vtkNew<vtkRenderWindowInteractor> interactor;interactor->SetRenderWindow(renderWindow);vtkNew<vtkPNGReader> imageIn;imageIn->SetFileName(filename.c_str());imageIn->Update();vtkNew<vtkImageActor> imageActor;imageActor->SetInputData(imageIn->GetOutput());originalRenderer->AddActor(imageActor);vtkNew<vtkImageLuminance> il;il->SetInputConnection(imageIn->GetOutputPort());vtkNew<vtkImageCast> ic;ic->SetOutputScalarTypeToFloat();ic->SetInputConnection(il->GetOutputPort());// Smooth the image.vtkNew<vtkImageGaussianSmooth> gs;gs->SetInputConnection(ic->GetOutputPort());gs->SetDimensionality(2);gs->SetRadiusFactors(1, 1, 0);// Gradient the image.vtkNew<vtkImageGradient> imgGradient;imgGradient->SetInputConnection(gs->GetOutputPort());imgGradient->SetDimensionality(2);vtkNew<vtkImageMagnitude> imgMagnitude;imgMagnitude->SetInputConnection(imgGradient->GetOutputPort());// Non maximum suppression.vtkNew<vtkImageNonMaximumSuppression> nonMax;imgMagnitude->Update();nonMax->SetMagnitudeInputData(imgMagnitude->GetOutput());imgGradient->Update();nonMax->SetVectorInputData(imgGradient->GetOutput());nonMax->SetDimensionality(2);vtkNew<vtkImageConstantPad> pad;pad->SetInputConnection(imgGradient->GetOutputPort());pad->SetOutputNumberOfScalarComponents(3);pad->SetConstant(0);vtkNew<vtkImageToStructuredPoints> i2sp1;i2sp1->SetInputConnection(nonMax->GetOutputPort());pad->Update();i2sp1->SetVectorInputData(pad->GetOutput());// Link edgles.vtkNew<vtkLinkEdgels> imgLink;imgLink->SetInputConnection(i2sp1->GetOutputPort());imgLink->SetGradientThreshold(2);// Threshold links.vtkNew<vtkThreshold> thresholdEdges;thresholdEdges->SetInputConnection(imgLink->GetOutputPort());thresholdEdges->SetUpperThreshold(10);thresholdEdges->SetThresholdFunction(vtkThreshold::THRESHOLD_UPPER);thresholdEdges->AllScalarsOff();vtkNew<vtkGeometryFilter> gf;gf->SetInputConnection(thresholdEdges->GetOutputPort());vtkNew<vtkImageToStructuredPoints> i2sp;i2sp->SetInputConnection(imgMagnitude->GetOutputPort());pad->Update();i2sp->SetVectorInputData(pad->GetOutput());// Subpixel them.vtkNew<vtkSubPixelPositionEdgels> spe;spe->SetInputConnection(gf->GetOutputPort());i2sp->Update();spe->SetGradMapsData(i2sp->GetStructuredPointsOutput());vtkNew<vtkStripper> strip;strip->SetInputConnection(spe->GetOutputPort());vtkNew<vtkPolyDataMapper> dsm;dsm->SetInputConnection(strip->GetOutputPort());dsm->ScalarVisibilityOff();vtkNew<vtkActor> planeActor;planeActor->SetMapper(dsm);planeActor->GetProperty()->SetAmbient(1.0);planeActor->GetProperty()->SetDiffuse(0.0);planeActor->GetProperty()->SetColor(colors->GetColor3d("GhostWhite").GetData());// Add the actors to the renderer, set the background and size.edgeRenderer->AddActor(planeActor);// Render the image.interactor->Initialize();renderWindow->Render();renderWindow->Render();interactor->Start();return EXIT_SUCCESS;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/670412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RFID手持终端_智能pda手持终端设备定制方案

手持终端是一款多功能、适用范围广泛的安卓产品&#xff0c;具有高性能、大容量存储、高端扫描头和全网通数据连接能力。它能够快速平稳地运行&#xff0c;并提供稳定的连接表现和快速的响应时&#xff0c;适用于医院、物流运输、零售配送、资产盘点等苛刻的环境。通过快速采集…

nba2k24 周琦面补

nba2k24 周琦面补 nba2k23-nba2k24通用 周琦面补 下载地址&#xff1a; https://www.changyouzuhao.cn/9649.html

Multisim14.0仿真(五十三)时、分、秒、毫秒数字计时器

一、仿真效果&#xff1a; 二、时钟脉冲配置&#xff1a; 三、24进制计数&#xff1a; 四、60进制计数&#xff1a;

Python||五城P.M.2.5数据分析与可视化_使用华夫图分析各个城市的情况(中)

目录 1.上海市的空气质量 2.成都市的空气质量 【沈阳市空气质量情况详见下期】 五城P.M.2.5数据分析与可视化——北京市、上海市、广州市、沈阳市、成都市&#xff0c;使用华夫图和柱状图分析各个城市的情况 1.上海市的空气质量 import numpy as np import pandas as pd impor…

爬虫(三)

1.JS逆向实战破解X-Bogus值 X-Bogus:以DFS开头&#xff0c;总长28位 答案是X-Bogus,因为会把负载里面所有的值打包生成X-Boogus 1.1 找X-Bogus加密位置&#xff08;请求堆栈&#xff09; 1.1.1 绝招加高级断点&#xff08;日志断点&#xff09; 日志断点看有没有X-B值 日志…

Leetcode—32. 最长有效括号【困难】(动态规划及ranges::max()使用)

2024每日刷题&#xff08;110&#xff09; Leetcode—32. 最长有效括号 栈实现代码 class Solution { public:int longestValidParentheses(string s) {stack<int> st;st.push(-1);int n s.size();int maxn 0;for(int i 0; i < n; i) {if(s[i] () {st.push(i);}…

Transformer实战-系列教程7:SwinTransformer 算法原理 1

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的PPT资源已经上传 1、SwinTransformer SwinTransformer 可以看作为一个backbone用来做分类、检测、分割都是非常好的…

zxxxxczzvdsgbhfdb

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏&#xff1a;《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…

低代码与MES系统相结合

​低代码平台通常是指aPaaS平台&#xff0c;通过为开发者提供可视化的应用开发环境&#xff0c;降低或去除应用开发对原生代码编写的需求量&#xff0c;进而实现便捷构建应用程序的一种解决方案。 更加简单点的理解就是“拖拽&#xff01;搭建应用”。 一、低代码开发平台概述 …

单片机最小系统是什么?包含哪几个部分?

单片机最小系统是什么&#xff1f;包含哪几个部分&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&…

流式 dbt:RisingWave 流计算的正确打开方式

让我们先来看一则 Reddit 经典提问&#xff1a; “为啥 dbt 如此流行&#xff1f;有没有替代品&#xff1f;” 获赞最多的回答抓住了精髓&#xff1a; “dbt 这么流行是因为它为 SQL 分析师和数据集市构建者提供了 Git 工作流&#xff0c;使得他们可以跟其他软件工程师一样工作…

Innodb索引页文件结构

Innodb索引页文件结构 首先Mysql的基本存储结构是页&#xff0c;Mysql中的存取数据是按照页进行存取的&#xff0c;在查找数据的时候是需要先定位到记录所在页&#xff0c;再从所在页中查找到相应的记录 数据页以一个双向链表维持着顺序&#xff0c;每个数据页以单向链表的格式…

nvm安装node后,npm无效

类似报这种问题&#xff0c;是因为去github下载npm时下载失败&#xff0c; Please visit https://github.com/npm/cli/releases/tag/v6.14.17 to download npm. 第一种方法&#xff1a;需要复制这里面的地址爬梯子去下载&#xff08;github有时不用梯子能直接下载&#xff0c;有…

CodeFuse-VLM 开源,支持多模态多任务预训练/微调

CodeFuse-MFT-VLM 项目地址&#xff1a;https://github.com/codefuse-ai/CodeFuse-MFT-VLM CodeFuse-VLM-14B 模型地址&#xff1a;CodeFuse-VLM-14B CodeFuse-VLM框架简介 随着huggingface开源社区的不断更新&#xff0c;会有更多的vision encoder 和 LLM 底座发布&#x…

力扣● 62.不同路径 ● 63. 不同路径 II

● 62.不同路径 单解这道题的话&#xff0c;发现第一行或者第一列的这些位置&#xff0c;都只有一条路径走到&#xff0c;所以路径条数都是1。这就是初始化。坐标大于第一行第一列的这些位置&#xff0c;因为机器人只能向下/向右走&#xff0c;所以只能从上个位置向下走和从左…

CentOS基于volatility2的内存取证实验

CentOS&#xff0c;Redhat和Fedora 都是Red Hat体系&#xff0c;采用yum管理器&#xff0c;不同于Debian、Ubuntu作为Debian体系使用apt 本文以CentOS为例&#xff0c;采用avml制作内存镜像&#xff0c;并利用volatility官方所给工具制作profile符号文件&#xff0c;进行简单的…

对象存储minio

参考Linux搭建免费开源对象存储 wget https://dl.minio.io/server/minio/release/linux-amd64/minio yum install -y wget yum install -y wget wget https://dl.minio.io/server/minio/release/linux-amd64/minio chmod x minio sudo mv minio /usr/local/bin/ minio --vers…

第7节、双电机直线运动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;前面章节主要介绍单个电机控制&#xff0c;本节内容介绍两个电机完成Bresenham直线运动 一、Bresenham直线算法介绍 Bresenham直线算法由Jack Elton Bresenham于1962年在IBM开发&#xff0c;最初用于计…

小白水平理解面试经典题目LeetCode 20. Valid Parentheses【栈】

20.有效括号 小白渣翻译 给定一个仅包含字符 ‘(’ 、 ‘)’ 、 ‘{’ 、 ‘}’ 、 ‘[’ 和 ‘]’ &#xff0c;判断输入字符串是否有效。 输入字符串在以下情况下有效&#xff1a; 左括号必须由相同类型的括号封闭。 左括号必须按正确的顺序关闭。 每个右括号都有一个对…

openstack(T版)公有云--Dashboard服务

公有云上OpenStack Train最小化安装_openstack最小化部署-CSDN博客 我的opensatck(T)是参考上面链接去部署完成的&#xff0c;在部署完Dashboard服务后&#xff0c;将要用浏览器访问的时候出现了404 500 Internal Server Error 等各种各样的问题&#xff0c;以下是我排查问题…