G = zeros(size(img)); % 生成和图片一样大的空模板 [row, col] = size(G); center_row = round(row/2); % 二维高斯函数图像的中心点 center_col = round(col/2); for i = 1:row for j = 1:col G(i, j) = (1 / (2*pi*sigmma^2)) * exp(- ((i-center_row)^2 + (j-center_col)^2) / (2*sigmma^2)); % 查看生成的高斯函数图像 G = mat2gray(G); figure,surf(G); % 2, 截取模板大小5x5 G_kernel = G(center_row-2:center_row+2, center_col-2:center_col+2); % 3, 滤波 new_img = zeros(row, col); for i = 3:row-2 for j = 3:col-2 new_img(i, j) = sum(sum(img(i-2:i+2, j-2:j+2) .* G_kernel)); new_img = mat2gray(new_img); figure,imshow(new_img);

2. C++实现:

#include <opencv2/opencv.hpp>
#include <math.h>  //pow
using namespace cv;
using namespace std;
#define pi 3.1415926
int main()
	Mat img = imread("D:/Code/Image/classic.jpg", 0);
	imshow("原图", img);
	// 1,利用高斯函数生成模板
	double sigmma = 1.0;
	int size = 5;
	int center_row = round(size / 2); // 0, 1, 2, 3, 4
	int center_col = round(size / 2);
	// 给5x5矩阵赋值
	double sum_value = 0.0;
	Mat kernel = Mat::zeros(Size(5, 5), CV_64F);
	for (int i = 0; i < size; i++)
		for (int j = 0; j < size; j++)
			kernel.at<double>(i, j) = 1 / (2 * pi*pow(sigmma, 2)) *
				exp(-(pow(i - center_row, 2) + pow(j - center_col, 2)) / (2 * pow(sigmma, 2)));
			sum_value += kernel.at<double>(i, j);
	// gaussain核内的值和为1
	for (int i = 0; i < size; i++) 
		for (int j = 0; j < size; j++)
			kernel.at<double>(i, j) = kernel.at<double>(i, j) / sum_value;
			//cout << G_kernel[i][j] << endl;
	//normalize(kernel, kernel, 1, 0, NORM_MINMAX);
	//cout << kernel;
	// 2,卷积
	Mat new_img = Mat::zeros(img.size(), CV_64F);
	for (int i = 2; i < img.rows-2; i++)
		for (int j = 2; j < img.cols-2; j++)
			//cout << 'i ' << i << 'j ' << j <<endl;
			Mat roi1;
			cv::Mat m_roi = img(cv::Range(i-2, i+3), cv::Range(j-2, j+3));
			m_roi.convertTo(roi1, CV_64F);  // 数据类型变换为double
			new_img.at<double>(i, j) = roi1.dot(kernel); // 点乘需要相同数据类型,不同于matlab,这里会求和
	new_img.convertTo(new_img, CV_8UC1);
	imshow("效果图", new_img);
	waitKey(0);

1) Kernel 内的数据 要定义为double类型: 

Mat kernel = Mat::zeros(Size(5, 5), CV_64F);

2)opecv的点乘操作,需要两个mat内的数据都是同类型:

new_img.at<double>(i, j) = roi1.dot(kernel); // 点乘需要相同数据类型,不用于matlab,这里会自动求和

3)Mat内保存的数据类型转化:

m_roi.convertTo(roi1, CV_64F);  // 数据类型变换为double

4)图像显示,需要将生成的Mat转化成8UC1类型:

new_img.convertTo(new_img, CV_8UC1);
imshow("效果图", new_img);

5)Mat类数据归一化到0到1之间:

normalize(kernel, kernel, 1, 0, NORM_MINMAX);  % 最好加上NORM_MINMAX

6)寻找矩阵Mat中最值及其位置:

double min, max;   // 检测最大值是否为1
Point minPt, maxPt;
minMaxIdx(kernel, &min, &max);
minMaxLoc(kernel, &min, &max, &minPt, &maxPt);

7)生成高斯核后,也可以自带函数简单直接卷积:

filter2D(img, new_img, img.depth(), kernel);

8)二维数组定义方式:

double **G_kernel = new double *[size];  // gaus为指针的指针,即指针指向的是一个指针,右边生成的是一个指针数组,数组内存放的是数组。
for (int i = 0; i < size; i++)
	G_kernel[i] = new double[size];

9)图像矩阵内,截取块:

Mat roi1;
cv::Mat m_roi = img(cv::Range(i-2, i+3), cv::Range(j-2, j+3));  // 包含开始,不包含结束(即不包含i+3)
m_roi.convertTo(roi1, CV_64F);  // 数据类型变换为double
new_img.at<double>(i, j) = roi1.dot(kernel); // 点乘需要相同数据类型,不同于matlab,这里会求和
原理:当前像素值,是由周围像素值决定。通过模板内的值与图像卷积,模板内的值可以直接给定,值有下降的过程即可,也可以通过二维高斯函数生成,这里是通过二维高斯函数生成。效果如下: 二维高斯函数,定义一个和原图一样大小的高斯函数图像,sigmma取1,其中(x0, y0)是图像的中心:这个截取的模板大小为5x5,以(x0, y0)为中心截取:1. Matlab代码实现:... 也就是对图像的像素点求偏导数,如果某个方向偏导数很大,一般来说就是不连续的,即轮廓线 但是图像里往往会有很讨厌的噪声点 如果不考虑这些点,直接对图像求梯度函数的话,就会收到很大的影响 滤波矩阵就是为了一定程度上消除噪声,其中比较常见的是高斯卷积滤波矩阵 在Matlab中是用fspecial('gaus 生成一个(2N+1)×(2N+1)大小的高斯模板H(标准为sigma),然后用此模板对图像进行滤波。不允许使用 fspecial 来产生高斯模板,不允许使用 imfilter、conv2 等函数。 原理及算法 理解:高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的... 一、图像金字塔 1.1、图像金字塔的概念       图像金字塔是 图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。 1.2、高斯金字塔 概念:高斯金字塔是在图像处理、计算. sigma = 2; kernel_size = 6*sigma+1; [x,y] = meshgrid(-(kernel_size-1)/2:(kernel_size-1)/2, -(kernel_size-1)/2:(kernel_size-1)/2); kernel = exp(-(x.^2+y.^2)/(2*sigma^2)); kernel = kernel./sum(kernel(:)); % 进行卷积 filtered_img = uint8(conv2(double(img), kernel, 'same')); % 显示结果 figure; subplot(1,2,1); imshow(img); title('原始图像'); subplot(1,2,2); imshow(filtered_img); title('高斯滤波后的图像'); 其中,高斯核的大小可以通过调整 `sigma` 的值来控制,通常情况下取 `sigma=1.5` 至 `sigma=3` 之间的值。卷积操作使用了 MATLAB 自带的 `conv2` 函数,其中 `'same'` 表示输出与输入大小相同。最后将卷积结果转换为整型图像并显示即可。 qq_47579910: real_point = real_point.to(device) # (b,1,2048,3) 原始完整点云坐标数据 real_center = real_center.to(device) # (b,1,512,3) 被裁剪下来的点云 input_cropped1 = input_cropped1.to(device) # (b,1,2048,3) 被裁剪后的点云, 大佬,为什么这里被裁剪后的点云和完整点云一样,不应该是(b,1,1536,3)吗 window下编译qt nodeeditor 是田同学啊: 我在使用VS2019+Qt5.15.2编译时,出现部分项目无法链接的情况,其中就有connection_color,请问有哪位大佬遇到过或者知道怎么解决吗 PF-Net基于深度学习的点云补全网络 Mr.Q: 可以参考源码ReadME,里面有详细的解释:https://github.com/zztianzz/PF-Net-Point-Fractal-Network PF-Net基于深度学习的点云补全网络 普通网友: 博主你好,parser.add_argument('--dataroot', default='dataset/train', help='path to dataset')这里是怎么放文件的 Dynamic dimensions required for input: input, but no shapes were provided. Automatically overriding Hello,Helson: 检查了导出onnx时候设置的名字和导出engine设置的参数,都没有问题。但还是报no shpaes were provided 缺陷检测-Mixed supervision for surface-defect detection:from weakly to fully supervised learning 实现pytorch版的mobileNetV1