LOG滤波器原理探究---计算机视觉和特征检测

先来看几个滤波器公式:

高斯滤波器:

G ( x , y ; σ ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 G(x,y;\sigma) = \frac{1}{2 \pi \sigma^2} e^{-\frac{x^2 + y^2}{2\sigma^2}} G(x,y;σ)=2πσ21e2σ2x2+y2

图像的二阶导数:

∇ 2 f = ∂ 2 f ∂ x 2 + ∂ f ∂ y 2 \nabla^2 f = \frac{\partial ^ 2 f}{\partial x^2} + \frac{\partial ^ f}{\partial y^2} 2f=x22f+y2f

LOG滤波器:
∇ 2 G ( x , y ; σ ) = ( x 2 + y 2 σ 4 − 2 σ 2 ) G ( x , y ; σ ) \nabla^2 G(x,y;\sigma) = (\frac{x^2 + y^2}{\sigma^4 }- \frac{2}{\sigma ^2}) G(x,y;\sigma) 2G(x,y;σ)=(σ4x2+y2σ22)G(x,y;σ)

计算机视觉材料中只有这几个孤零零的公式,没找到详细的说明,初次时便感到很有趣,但是不知道究竟如何利用这几个公式,以便实现滤波效果,但是我进行了如下测试。

首先声明,图片的操作目标是bmp图片。关于bmp图片的格式和操作,请看我的另一个帖子:https://blog.csdn.net/m0_37567738/article/details/134639843?spm=1001.2014.3001.5501

  1. 卷积操作。这个简单,根据卷积的定义操作即可,没什么好说的。但是实际操作过程中有一个奇怪的现象是:使用高斯卷积、双线性、sobel、角点、方框等几种常见卷积核测试,如果去掉卷积核前面的比例系数,会有一定的效果,如果保留,卷积无效,就是说卷积后图片未发生变化。后来发现,原因是将像素当作无符号数,改为有符号数后异常消失。

  2. 基于c/c++的、上述几个滤波公式的效果测试。有个问题是,我不知道上述几个滤波公式里面的x和y是什么意思,究竟是代表像素的坐标还是像素的值。首先,如果代表的是坐标的话,那么像素值将毫无意义,这显然是不可能的;但是如果代表的是像素值,那么究竟是像素的差异值还是像素值呢?我觉得都可以,不论是差异还是像素值,该公式都可以一定程度上体现出图片的特征。而老师表达的意思是,x和y代表是坐标值。我在测试中,使用的是如下方法:将图片中的像素值,从x和y两个方向,分别计算下一个像素对当前像素的差值,然后分别生成两张图片,然后将这两张图片中的像素值当作x和y,带入log公式,然后查看结果。

代码如下,其中的convolution是卷积函数,默认使用高斯滤波器;bmpFeature是滤波函数,其中x代表水平方向上当前像素和下一个像素的差值,y代表垂直方向上当前像素和下一个像素的差值,然后将x和y值带入LOG公式中。





#include "feature.h"

#include <math.h>

#include <stdio.h>

#include <Windows.h>

#define _USE_MATH_DEFINES

//#define FILTER_DIMENSION 5
//double g_filter[FILTER_DIMENSION][FILTER_DIMENSION] = { 1,4,6,4,1,4,6,24,16,4,6,24,36,24,6,4,6,24,16,4,1,4,6,4,1 };


#define FILTER_DIMENSION 3

double g_filter[FILTER_DIMENSION][FILTER_DIMENSION] = { 1,-2,1,-2,4,-2,1,-2};


int convolution( char* data, int h, int w) {
	char* newdata = new  char[w * (h + FILTER_DIMENSION)];
	memset(newdata, 0, w * h);

	for (int i = 0; i < h - FILTER_DIMENSION + 1;i ++) {
		for (int j = 0; j < w - FILTER_DIMENSION + 1; j++) {
			
			int p = i * w + j;
			double t = 0;

			for (int k = 0; k < FILTER_DIMENSION; k++) {

				for (int m = 0; m < FILTER_DIMENSION; m++) {
					
					t += data[p + k * w + m] * g_filter[k][m];
				}
			}
			newdata[p] = t/256;
		}
	}

	memcpy(data, newdata, w * h);

	delete[]newdata;

	return 0;
}


int bmpFeature(char* data, int h, int w) {
	char* newdata = new char[w * h];
	memset(newdata, 0, w * h);

	char* td1 = new char[w * h];
	memset(td1, 0, w * h);
	char* td2 = new char[w * h];
	memset(td2, 0, w * h);

	for (int i = 0; i < h - 1; i++) {
		for (int j = 0; j < w - 1; j++) {
			int p = i * w + j;
			int p1 = +1;
			int p2 = p + w;
			td1[p] = data[p1] - data[p];
			td2[p] = data[p2] - data[p];
		}
	}

	double pi = acos(-1);

	for (int i = 0; i < h; i++) {
		for (int j = 0; j < w; j++) {
			int p = i * w + j;

			double t1 = ((td1[p]) ^ 2 + (td2[p]) ^ 2);
			double c1 = (t1 - 2) * exp(-t1 / 2) / (2 * pi);

			newdata[p] = c1;

		}
	}

	memcpy(data, newdata, w * h);

	delete[]newdata;

	delete []td1;
	delete []td2;

	return 0;
}



int bmpFeature1( char * data,int h,int w) {
	char* newdata = new char[w * h];
	memset(newdata, 0, w * h);

	double pi = acos(-1);

	for (int i = 0; i < h; i++) {
		for (int j = 0; j < w; j++) {
			int x = i * w + j;
			int y = x + w;
			if (y >= h*w) {
				y = x;
			}

			double t1 = ( (data[x]) ^ 2 + (data[y]) ^ 2);
			double c1 =  (t1-2)* exp(-t1/2)/(2*pi);

			y = x + 1;
			if (x % w == 0) {
				//y = x;
			}
			double t2 = ((data[x]) ^ 2 + (data[y]) ^ 2);
			double c2 = (t2 - 2) * exp(-t2 / 2) / (2 * pi);

			//newdata[x] =  256 - (c1 + c2)/2;

			//newdata[x] = 256 - c1;

			newdata[x] = 256 - ( c2) ;
		}
	}

	memcpy(data, newdata, w * h);

	delete []newdata;

	return 0;
}


原始图片的灰度图片:

在这里插入图片描述

使用sobel核卷积后的图片:

在这里插入图片描述

使用高斯核卷积后的图片:

在这里插入图片描述

将x和y看作是对一个像素从x方向和y方向上的变化值,并带入LOG公式后,所得到的图片:

在这里插入图片描述

先sobel核卷积,又使用x、y两个方向的差值带入上述公式后的图片:

在这里插入图片描述

先高斯核卷积,又使用x、y两个方向的差值带入上述公式后的图片:
在这里插入图片描述

将像素值当作无符号数( 乱搞一气 😀 😃 😀)的测试效果图:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

看图识熊(二)

使用Tools for AI封装onnx模型并推理 进行这一步之前&#xff0c;请确保已正确安装配置了Visual Studio 2017 和 Microsoft Visual Studio Tools for AI环境。 项目的代码也可以在这里找到&#xff0c;下面的步骤是带着大家从头到尾做一遍。 界面设计 创建Windows窗体应用(…

ssm基于Java Web的怀旧唱片售卖系统论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装怀旧唱片售卖系统软件来发挥其高效地信息处理的作用&#x…

k8s集群部署Harbor镜像仓库

部署k8s集群参考 https://blog.csdn.net/m0_59933574/article/details/134936188?spm1001.2014.3001.5502https://blog.csdn.net/m0_59933574/article/details/134936188?spm1001.2014.3001.5502 安装Harbor 准备一台干净服务器&#xff0c;关闭防火墙与selinux 下载dock…

探索 2024 年:未来可能带来的新奇事物

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

XML技术分析02

一、XML——树形结构 <?xml version"1.0" encoding"ISO-8859-1"?><note><to>George</to><from>John</from><heading>Reminder</heading><body>Dont forget the meeting!</body> </note…

LeetCode 42:接雨水

一、题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,…

LeetCode刷题--- 不同路径 II

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述动…

Simply主题 简约风格的Emlog博客模板 响应式布局

主题介绍 Simply是一款简约风格的Emlog博客模板&#xff0c;响应式布局、界面简单大方&#xff0c;实用性强&#xff01; 支持夜间模式&#xff0c;采用localStorage存储配置。IOS系统下支持随系统自动切换浅/深色模式。 文章页支持显示文章字数及阅读时间。 支持http/https …

书摘:C 嵌入式系统设计模式 06

本书的原著为&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;讲解的是嵌入式系统设计模式&#xff0c;是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述原书第 2 章的内容。 作为嵌入…

BetaFlight开源代码之电压校准

BetaFlight开源代码之电压校准 1. 源由2. 分析数据流3. 采样电路3. 原理4. 示例5. 实测&转换数据6. 参考资料 1. 源由 既然复杂的BetaFlight开源代码之电流校准都过了一遍&#xff0c;电压相对来说是比较简单的&#xff0c;一起过一下 2. 分析数据流 电源路径1》采样电路…

Pix2Seq 算法阅读记录

目录 前向传播过程 训练过程&#xff1a; 网络结构 前向传播过程 batch_preds--> tgt-->tgtcat(tgt, padding)-->tgt_embedding-->tgt_mask,tgt_padding_mask 以NLP的角度&#xff0c;tgt 代表了 词汇表的长度&#xff0c;encoder部分直接对图像进行处理&#…

优势演员-评论家算法 A2C

优势演员-评论家算法 A2C 优势演员-评论家算法 A2C主要思想目标函数 优势演员-评论家算法 A2C 前置知识&#xff1a;演员-评论家算法&#xff1a;多智能体强化学习核心框架 主要思想 AC 网络结构&#xff1a; 策略网络 - 演员: 这个网络负责根据当前的状态选择动作。它输出的是…

LabVIEW在指针式仪表读数中的应用

在LabVIEW环境中&#xff0c;为实现指针式仪表的自动读数&#xff0c;首先进行图像预处理&#xff0c;包括图像缩放、灰度化和二值化&#xff0c;以提高处理速度和减少噪声干扰。利用LabVIEW的图像处理功能&#xff0c;灰度化和二值化操作简化了图像的色彩信息&#xff0c;便于…

Java HashMap 面试题(一)

HashMap 面试题&#xff08;一&#xff09; 文章目录 HashMap 面试题&#xff08;一&#xff09;3.3 面试题-说一下HashMap的实现原理&#xff1f;面试题-HashMap的put方法的具体流程hashMap常见属性源码分析 3.3 面试题-说一下HashMap的实现原理&#xff1f; HashMap的数据结…

Mongodb删除操作中字符序对结果的影响

本文还是要从删除操作的语法说起。 db.collection.deleteMany(<filter>,{writeConcern: <document>,collation: <document>,hint: <document|string>} ) 删除语法中&#xff0c;可以指定数据写入策略&#xff0c;字符序和使用的索引字段。 字符序&a…

2024--Django平台开发-Web框架和Django基础(二)

day02 Web框架和Django基础 今日概要&#xff1a; 网络底层引入&#xff0c;到底什么是web框架&#xff1f;常见web框架对比django快速上手&#xff08;创建网站&#xff09;常见操作&#xff1a;虚拟环境、django项目、多app应用、纯净版逐点剖析&#xff1a;路由、视图、模…

mysql的分页查询

我们来看下一段查询&#xff1a; select * from sys_role; 如果我们要进行分页查询&#xff0c;例如每页显示两条数据&#xff0c;我们可以利用 limit 关键字&#xff1a; select * from sys_role limit 0,2; select * from sys_role limit 2,2; 假设我们当前页面为 n&#xf…

机器学习--ROC AUC

参考 机器学习-ROC曲线 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/347470776一文看懂ROC、AUC - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/81202617 在了解之前&#xff0c;我们先来认识一下以下的概念 针对一个二分类问题&#xff0c;将实例分成正类(postive)或…

java基于SSM的游戏商城的设计与实现论文

基于SSM的游戏商城的设计与实现 摘 要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前相关行业对于游戏信息的管理和控制&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以…

系统及应用安全

引导语 系统安全及应用是现代信息系统的核心组成部分&#xff0c;它不仅关乎信息安全&#xff0c;更直接影响到企业的运营效率、财务状况乃至品牌信誉。通过不断改进和强化系统的安全性&#xff0c;可以为企业创造一个更加可靠、高效的信息化环境。 一、账号安全的基本措施 …