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πσ21e−2σ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=∂x2∂2f+∂y2∂f

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是什么意思,究竟是代表像素的坐标还是像素的值。首先,如果代表的是坐标的话,那么像素值将毫无意义,这显然是不可能的;但是如果代表的是像素值,那么究竟是像素的差异值还是像素值呢?我觉得都可以,不论是差异还是像素值,该公式都可以一定程度上体现出图片的特征。如果哪位大哥看到此贴,请务必指点迷津,简单阐述一下上述DOG公式的实现原理,留下宝贵的意见。

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

cpp 复制代码
#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 };


int convolution(unsigned char* data, int h, int w) {
	unsigned char* newdata = new unsigned 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(unsigned 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;
}

原始图片:

测试效果图:

相关推荐
sali-tec1 小时前
C# 基于halcon的视觉工作流-章42-手动识别文本
开发语言·人工智能·算法·计算机视觉·c#·ocr
AndrewHZ5 小时前
【图像处理基石】暗光增强算法入门:从原理到实战(Python+OpenCV)
图像处理·python·opencv·算法·计算机视觉·cv·暗光增强
七元权6 小时前
论文阅读-FoundationStereo
论文阅读·深度学习·计算机视觉·零样本·基础模型·双目深度估计
研梦非凡9 小时前
ShapeLLM: 用于具身交互的全面3D物体理解
人工智能·深度学习·计算机视觉·3d·架构·数据分析
CoovallyAIHub10 小时前
YOLO26学界首评:四大革新点究竟有多强?
深度学习·算法·计算机视觉
2401_8414956410 小时前
【计算机视觉】霍夫变换函数的参数调整
人工智能·python·算法·计算机视觉·霍夫变换·直线检测·调整策略
bylander11 小时前
【论文阅读】通义实验室,VACE: All-in-One Video Creation and Editing
论文阅读·人工智能·计算机视觉·音视频
AndrewHZ12 小时前
【图像处理基石】GIS图像处理入门:4个核心算法与Python实现(附完整代码)
图像处理·python·算法·计算机视觉·gis·cv·地理信息系统
格林威21 小时前
常规线扫描镜头有哪些类型?能做什么?
人工智能·深度学习·数码相机·算法·计算机视觉·视觉检测·工业镜头
B站计算机毕业设计之家1 天前
智慧交通项目:Python+YOLOv8 实时交通标志系统 深度学习实战(TT100K+PySide6 源码+文档)✅
人工智能·python·深度学习·yolo·计算机视觉·智慧交通·交通标志