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:
window下编译qt nodeeditor
是田同学啊:
PF-Net基于深度学习的点云补全网络
Mr.Q:
PF-Net基于深度学习的点云补全网络
普通网友:
Dynamic dimensions required for input: input, but no shapes were provided. Automatically overriding
Hello,Helson:
缺陷检测-Mixed supervision for surface-defect detection:from weakly to fully supervised learning
实现pytorch版的mobileNetV1