使用VC++实现锐化处理(使用Sobel算子、Prewitt算子、Isotropic算子)

使用VC++实现锐化处理(使用Sobel算子、Prewitt算子、Isotropic算子)

获取源工程可访问gitee可在此工程的基础上进行学习。
该工程的其他文章:
01- 一元熵值、二维熵值
02- 图像平移变换,图像缩放、图像裁剪、图像对角线镜像以及图像的旋转
03-邻域平均平滑算法、中值滤波算法、K近邻均值滤波器
04-分段线性变换,直方图均衡化、锐化处理
05-基于拉普拉斯算子、Canny的边缘检测功能、实现Otsu分割方法
06-最近邻插值,双线性插值,立方卷积插值
07-全局固定阈值分割、自适应阈值分割
08-K近邻中值滤波器(KNNMF)、最小均方差滤波器、矢量中值滤波算法

文章目录

  • 使用VC++实现锐化处理(使用Sobel算子、Prewitt算子、Isotropic算子)
    • 实验内容
    • 一、Sobel算子
      • 1.Sobel算子锐化原理
      • 2.Sobel算子锐化实验代码
      • 3.Sobel算子锐化现象
    • 二、Prewitt算子
      • 1.Prewitt算子锐化原理
      • 2.Prewitt算子锐化实验代码
      • 3.Prewitt算子锐化实验现象
    • 三、Isotropic算子
      • 1.Isotropic算子锐化原理
      • 2.Isotropic算子锐化实验代码
      • 3.Isotropic算子锐化实验现象

实验内容

对一幅256级灰度图像,使用VC++实现锐化处理(使用Sobel算子、Prewitt算子、Isotropic算子)。

一、Sobel算子

1.Sobel算子锐化原理

Sobel算子是一种常用于图像处理的边缘检测算子,也可用于图像锐化。其原理基于对图像的卷积操作,计算图像中每个像素点的梯度值。Sobel算子有水平方向和垂直方向两种核,分别用于检测图像中的水平和垂直边缘。

Sobel算子的水平方向卷积核:

-1  0  1
-2  0  2
-1  0  1

Sobel算子的垂直方向卷积核:

-1 -2 -10  0  01  2  1

算法步骤如下:

  1. 对于图像中的每个像素点,将其与Sobel算子的卷积核进行卷积操作,分别计算水平方向和垂直方向的梯度值。

  2. 将水平和垂直方向的梯度值合并,一般使用这两个梯度值的平方和的开根号,得到最终的梯度值。

  3. 将得到的梯度值映射到图像的灰度范围,例如,通过取整和截断的方式将其限定在0到255之间。

  4. 最终得到的图像就是经过Sobel算子锐化后的图像,边缘特征更加明显。

Sobel算子的优势在于简单易实现,对噪声具有一定的抑制作用,常用于图像边缘检测和锐化。

2.Sobel算子锐化实验代码

 // 循环控制变量int y;int x;CSize sizeImage = pDib->GetDimensions();int nWidth = sizeImage.cx ;int nHeight= sizeImage.cy ;int templatewidth = 3;int templateheight = 3;int gx[100] = { 1,0,-1,2,0,-2,1,0,-1 };int gy[100] = { -1,-2,-1,0,0,0,1,2,1 };for (y = 1; y < nHeight - 1; y++)for (x = 1; x < nWidth - 1; x++){double Gx = 0, Gy = 0;for(int k=0;k< templatewidth;k++)for (int m = 0; m < templateheight; m++){int gray = pDoc->m_pDibInit->GetPixelGray(x - templatewidth / 2 + m, y - templateheight / 2 + k);Gx += gx[k * templatewidth + m] * gray;Gy += gy[k * templatewidth + m] * gray;}double G_xy = sqrt(Gx * Gx + Gy * Gy); //平方和开根号pDoc->m_pDibTest->SetPixelGray(x, y, (int)G_xy);}

3.Sobel算子锐化现象

在这里插入图片描述

二、Prewitt算子

1.Prewitt算子锐化原理

Prewitt算子是一种用于图像处理的边缘检测和图像锐化的卷积算子。它类似于Sobel算子,但其权重系数略有不同。Prewitt算子有两个核,分别用于水平和垂直方向的卷积。

水平方向的Prewitt核:

-1  0  1
-1  0  1
-1  0  1

垂直方向的Prewitt核:

-1 -1 -10  0  01  1  1

Prewitt算子的原理是通过卷积计算图像中每个像素点与其周围像素的梯度,以检测图像中的边缘。具体步骤如下:

  1. 对图像进行灰度处理(如果图像不是灰度图)。

  2. 使用水平和垂直方向的Prewitt核对图像进行卷积操作,分别得到水平方向(Gx)和垂直方向(Gy)的梯度图像。

  3. 计算每个像素的梯度大小,通常使用以下公式:

    G = G x 2 + G y 2 G = \sqrt{Gx^2 + Gy^2} G=Gx2+Gy2

  4. 将计算得到的梯度大小映射到新的像素值范围(例如,0到255),以生成最终的锐化图像。

Prewitt算子主要用于强调图像中的垂直或水平边缘。在图像处理中,它常被应用于边缘检测、特征提取和图像增强等任务。

2.Prewitt算子锐化实验代码

只需要在sobel算子的基础上更改两个核

//Prewitt算子int gx[100] = { 1,0,-1,1,0,-1,1,0,-1 };int gy[100] = { -1,-1,-1,0,0,0,1,1,1 };

3.Prewitt算子锐化实验现象

在这里插入图片描述

三、Isotropic算子

1.Isotropic算子锐化原理

在图像处理中,Isotropic算子是一种用于图像锐化的算子,它基于图像的梯度信息,类似于Sobel和Prewitt算子。Isotropic算子主要强调图像中的各个方向的边缘。

Isotropic算子没有固定的卷积核,而是根据图像中每个像素点周围的梯度方向进行动态调整。其原理如下:

  1. 计算梯度: 对图像进行梯度计算,通常使用Sobel、Prewitt或其他梯度算子。这一步会得到每个像素点的梯度强度和方向。

  2. 动态卷积核: 对于每个像素点,根据其梯度方向调整卷积核。通常,Isotropic算子采用一个可旋转的卷积核,可以在不同方向上产生不同的响应。这个卷积核可以根据梯度方向旋转一定的角度。

  3. 卷积操作: 使用动态调整后的卷积核对图像进行卷积操作。这一步产生的结果是在多个方向上对图像进行了锐化处理,以增强图像中各个方向的特征。

  4. 灰度映射: 将卷积操作得到的结果映射到合适的灰度范围,以生成最终的锐化图像。

Isotropic算子的优势在于它对于不同方向的边缘都有较好的响应,能够更全面地提取图像的特征。然而,由于其动态卷积核的设计,计算成本可能较高,具体实现时需要根据应用场景进行权衡。

2.Isotropic算子锐化实验代码

只需要在sobel算子的基础上更改两个核

 //Isotropic算子图像锐化// 设置模板系数double gx[100] = { 1,0,-1,sqrt(2),0,-sqrt(2),1,0,-1 };double gy[100] = { -1,-sqrt(2),-1,0,0,0,1,sqrt(2),1 };

3.Isotropic算子锐化实验现象

在这里插入图片描述

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

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

相关文章

Vxworks6.9的在线gdb调试(仿真内核和板载内核)

创作目的&#xff1a;归纳总结常用的技巧和方法&#xff0c;方便自己后续查阅重点节省时间。 一、仿真内核的gdb调试 1、新建DKM工程&#xff0c;选择sim的BSP包 2、DKM工程中添加c文件并编辑入口函数 3、新建vxworks远端系统 4、显示系统起来之后进行加载.out 5、选择Debug模…

基于hadoop下的Kafka分布式安装

简介 Kafka是一种分布式流处理平台&#xff0c;它具有高吞吐量、可扩展性、可靠性、实时性和灵活性等优点。它能够支持每秒数百万条消息的传输&#xff0c;并且可以通过增加节点来增加吞吐量和存储容量。Kafka通过将数据复制到多个节点来实现数据冗余和高可用性&#xff0c;即使…

Linux脚本awk命令

目录 一. awk命令简介 1. awk版本 2. awk与vim的区别 3. awk与sed的区别 4. awk工作原理 5. awk格式 6. awk常用选项 二. awk基础用法 1. awk基础用法 2. BEGIN和END语句块 3. 指定分隔符 4. 首尾关键字 三. awk内置变量 1. FS变量 2. OFS变量 3. RS变量 4. NF…

30、LCD1602

LCD1602介绍 LCD1602&#xff08;Liquid Crystal Display&#xff09;液晶显示屏是一种字符型液晶显示模块&#xff0c;可以显示ASCII码的标准字符和其它的一些内置特殊字符&#xff0c;还可以有8个自定义字符 显示容量&#xff1a;162个字符&#xff0c;每个字符为5*7点阵 …

理解SpringIOC和DI第一课(Spring的特点),IOC对应五大注解,ApplicationContext vs BeanFactory

Spring是一个包含众多工具等Ioc容器 对象这个词在Spring范围内&#xff0c;称为bean Spring两大核心思想 1.IOC (IOC是控制反转&#xff0c;意思是控制权反转-控制权&#xff08;正常是谁用这个对象&#xff0c;谁去创建&#xff0c;&#xff09;-控制对象的控制权&#xf…

轻量封装WebGPU渲染系统示例<41>- 前向渲染的雾(Fog)效果(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/FogTest.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下&#xff1a; export class FogTest {private mRscene new Rend…

优化你的计算机性能:如何根据 CPU 占用率决定硬件升级

优化你的计算机性能&#xff1a;如何根据 CPU 占用率决定硬件升级 一、引言二、CPU 占用率的意义与影响三、监测和评估 CPU 占用率四、判断硬件升级需求的依据五、硬件升级方案和建议六、总结 一、引言 计算机性能优化是提升计算机系统整体效能的过程&#xff0c;它对于用户和…

React立即更新DOM

正常情况下&#xff0c;react会等待set完毕后再进行页面渲染&#xff0c;所以在set时无法拿到更新后的dom import { useRef, useState } from "react"export default () > {const div useRef(null)const [count, setCount] useState(0)const btnClick () >…

各大期刊网址

AAAL: http://dblp.uni-trier.de/db/conf/aaai/ CVPR: http://dblp.uni-trier.de/db/conf/cvpr/ NeurlPS:http://dblp.uni-trier.de/db/conf/nips/ ICCV: http://dblp.uni-trier.de/db/conf/iccv/ IJCAL: http://dblp.uni-trier.de/db/conf/ijcal/ 并非原创引…

微机原理——定时器8253(8254)学习2应用与设计

目录 简要说明 用户扩展的定时计数器应用举例 1 8254作测量脉冲宽度 2 8254作定时 3 8254作分频 4 8254同时用作计数与定时 硬件设计 ​编辑软件设计 微机系统中定时计数器应用举例 5 计时器设计 硬件设计 软件设计 6 发生器设计 硬件设计 软件设计 简要说明 定…

LinuxBasicsForHackers笔记 --网络分析和管理

使用 ifconfig 分析网络 ifconfig – ifconfig 命令是用于检查活动网络接口并与之交互的最基本工具之一。只需在终端中输入 ifconfig 即可使用它来查询当前活动的网络连接。命令输出的顶部是第一个检测到的接口的名称。第二行包含当前分配给该网络接口的 IP 地址的信息&#x…

网上商城、宠物商城源码(Java)

javaWebjsp网上书城以及宠物商城源码&#xff0c;功能有购物车、收藏以及下单等等功能 带后台管理功能 运行示意图&#xff1a;

iOS 自动签名打包,并用脚本上传appstore

背景&#xff1a; 1&#xff09;测试环境给测试&#xff0c;产品&#xff0c;或者其他业务人员打测试包时&#xff0c;经常存在需要添加设备&#xff0c;不得不重新生成描述文件&#xff0c;手动去更新打包机描述文件配置 2&#xff09;证书&#xff0c;描述文件过期造成打包失…

STM32-SPI 中断

SPI协议 1.1 SPI总线介绍 SPI接口是Motorola &#xff08;motorola | Smartphones, Accessories & Smart Home Devices&#xff09;首先提出的全双工三线/四线同步串行外围接口采用主从模式&#xff08;Master Slave&#xff09;架构。 时钟由Master控制&#xff0c;在时钟…

垃圾回收与内存泄漏

前端面试大全JavaScript垃圾回收与内存泄漏 &#x1f31f;经典真题 &#x1f31f;什么是内存泄露 &#x1f31f;JavaScript 中的垃圾回收 &#x1f31f;标记清除 &#x1f31f;引用计数 &#x1f31f;真题解答 &#x1f31f;总结 &#x1f31f;经典真题 请介绍一下 Jav…

P7 链表 链表头前方插入新节点

目录 前言 01 链表头插入数据 示例代码 02 指定节点前方插入新节点 测试代码 前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C》✨✨✨ &#x1f525; 推荐专栏2: 《 Linux C应用编程&#xff08;概念类&#xff09;_ChenPi的博客-CSDN博客》✨…

Web前端JS如何获取 Video/Audio 视音频声道(左右声道|多声道)、视音频轨道、音频流数据

写在前面&#xff1a; 根据Web项目开发需求&#xff0c;需要在H5页面中&#xff0c;通过点击视频列表页中的任意视频进入视频详情页&#xff0c;然后根据视频的链接地址&#xff0c;主要是 .mp4 文件格式&#xff0c;在进行播放时实时的显示该视频的音频轨道情况&#xff0c;并…

史上最全低代码平台盘点!三分钟盘点2023年顶尖二十个低代码平台!

史上最全低代码平台盘点&#xff01;三分钟盘点2023年顶尖二十个低代码平台&#xff01; 什么是低代码平台&#xff1f;2023年顶尖二十大低代码平台&#xff0c;哪个值得一试&#xff1f;低代码平台应该如何选择&#xff1f;本篇&#xff0c;我们将为大家盘点顶尖的十大低代码平…

分享一个简单的基于C语言嵌入式GUI界面切换代码

目录 前言 一、数据类型 二、页面调度 三、页面显示 四、视频展示 前言 最近在用LVGL写一个简单的UI界面&#xff0c;需要进行几个页面的切换&#xff0c;所以就自己写了一个简单页面切换代码&#xff0c;方便进行页面切换&#xff0c;同时使UI代码结构更加清晰。这个结构…

非常好的简历精选7篇

想要打造一份令人眼前一亮的简历&#xff0c;赢得招聘方的青睐&#xff1f;参考这7篇精选的“非常好的简历”案例&#xff01;无论是应届毕业生还是职场人士&#xff0c;都能从中借鉴灵感&#xff0c;提升简历质量。让求职之路更加顺畅&#xff0c;轻松斩获心仪职位&#xff01…