1、生成高斯核
Mat Gass_Kernel(float sigmma)
{
Mat Kernel = Mat(Size(3, 3), CV_32FC1);
float val_sum = 0.f;
for (int i=0;i<3;i++)
for (int j = 0; j < 3; j++)
{
float val = exp(-((i - 3/2)*(i - 3/2) + (j - 3/2)*(j - 3/2)) / (2 * sigmma*sigmma));
Kernel.at<float>(i, j) = val;
val_sum += val;
}
cout << Kernel << endl;
cout << val_sum << endl;
for (int i = 0; i<3; i++)
for (int j = 0; j < 3; j++)
{
Kernel.at<float>(i, j) = Kernel.at<float>(i, j)/ val_sum;
}
return Kernel;
}
2、卷积
Mat Conv(Mat &map, Mat & kernel)
{
int new_h =int((map.rows - kernel.rows)/1)+1;
int new_w= int((map.cols - kernel.cols) /1) + 1;
Mat new_mat = Mat(Size(new_h, new_w), map.depth());
for (int i = 1; i < map.rows-1; i++)
{
for (int j = 1; j < map.cols - 1; j++)
{
//卷积计算
float value = 0.f;
for (int k_i=-1 ;k_i<=1 ;k_i++)
for (int k_j = -1; k_j <= 1; k_j++)
{
value += kernel.at<uchar>(k_i + 1, k_j + 1)*map.at<uchar>(i + k_i, j + k_j);
}
new_mat.at<uchar>(i, j) = uchar(value);
}
}
return new_mat;
}
3、池化
float getMax(Mat matrix, int kernel_size, int x, int y) {
float max_value = matrix.at<uchar>(x,y);
for (int i = 0; i < kernel_size; i++) {
for (int j = 0; j < kernel_size; j++) {
if (max_value < matrix.at<uchar>(x+i,y+j))
{
max_value = matrix.at<uchar>(x + i, y + j);
}
}
}
return max_value;
}
Mat Pool(Mat feat_mat,int kernel_size=3,int strides=2)
{
int src_img_h = feat_mat.rows;
int src_img_w= feat_mat.cols;
int new_h = int((feat_mat.rows- kernel_size)/ strides+1);
int new_w = int((feat_mat.cols - kernel_size) / strides + 1);
printf("%d %d", new_h, new_w);
Mat new_mat = Mat(Size(new_h, new_w), feat_mat.depth());
for (int i = 0; i < new_mat.rows ; i++)
{
for (int j = 0; j < new_mat.cols; j++)
{
float gray_value = getMax(feat_mat, 3, i*strides, j*strides);
new_mat.at<uchar>(i, j) = gray_value;
}
}
return new_mat;
}
4、所有代码合起来
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/ml/ml.hpp>
#include <stdlib.h>
#include<ctime> //时间
#include <map>
#include <cassert>
#include <direct.h>
#include <io.h>
using namespace std;
using namespace cv;
Mat Conv(Mat &map, Mat & kernel)
{
int new_h =int((map.rows - kernel.rows)/1)+1;
int new_w= int((map.cols - kernel.cols) /1) + 1;
Mat new_mat = Mat(Size(new_h, new_w), map.depth());
for (int i = 1; i < map.rows-1; i++)
{
for (int j = 1; j < map.cols - 1; j++)
{
//卷积计算
float value = 0.f;
for (int k_i=-1 ;k_i<=1 ;k_i++)
for (int k_j = -1; k_j <= 1; k_j++)
{
value += kernel.at<uchar>(k_i + 1, k_j + 1)*map.at<uchar>(i + k_i, j + k_j);
}
new_mat.at<uchar>(i, j) = uchar(value);
}
}
return new_mat;
}
Mat Gass_Kernel(float sigmma)
{
Mat Kernel = Mat(Size(3, 3), CV_32FC1);
float val_sum = 0.f;
for (int i=0;i<3;i++)
for (int j = 0; j < 3; j++)
{
float val = exp(-((i - 3/2)*(i - 3/2) + (j - 3/2)*(j - 3/2)) / (2 * sigmma*sigmma));
Kernel.at<float>(i, j) = val;
val_sum += val;
}
cout << Kernel << endl;
cout << val_sum << endl;
for (int i = 0; i<3; i++)
for (int j = 0; j < 3; j++)
{
Kernel.at<float>(i, j) = Kernel.at<float>(i, j)/ val_sum;
}
return Kernel;
}
float getMax(Mat matrix, int kernel_size, int x, int y) {
float max_value = matrix.at<uchar>(x,y);
for (int i = 0; i < kernel_size; i++) {
for (int j = 0; j < kernel_size; j++) {
if (max_value < matrix.at<uchar>(x+i,y+j))
{
max_value = matrix.at<uchar>(x + i, y + j);
}
}
}
return max_value;
}
Mat Pool(Mat feat_mat,int kernel_size=3,int strides=2)
{
int src_img_h = feat_mat.rows;
int src_img_w= feat_mat.cols;
int new_h = int((feat_mat.rows- kernel_size)/ strides+1);
int new_w = int((feat_mat.cols - kernel_size) / strides + 1);
printf("%d %d", new_h, new_w);
Mat new_mat = Mat(Size(new_h, new_w), feat_mat.depth());
for (int i = 0; i < new_mat.rows ; i++)
{
for (int j = 0; j < new_mat.cols; j++)
{
float gray_value = getMax(feat_mat, 3, i*strides, j*strides);
new_mat.at<uchar>(i, j) = gray_value;
}
}
return new_mat;
}
int main(int argc, char *argv[])
{
Mat img = imread("./1/00.jpg",0);
Mat save_img;
Mat Feature_map=Gass_Kernel(1);
save_img=Conv(img, Feature_map);
save_img = Conv(img, Feature_map);
save_img = Conv(img, Feature_map);
save_img = Conv(img, Feature_map);
Mat poolmat=Pool(save_img, 3, 2);
cout << Feature_map << endl;
imwrite("tesp.jpg", poolmat);
system("pause");
return 0;
}
void main_15()
{
int i, j;
double sigma = 1;
const int N = 3;
double gussian[N][N];
double sum = 0.0;
for (i = 0; i<N; i++)
{
for (j = 0; j<N; j++)
{
gussian[i][j] = exp(-((i - N / 2)*(i - N / 2) + (j - N / 2)*(j - N / 2)) / (2.0*sigma*sigma));
printf("%f ,", gussian[i][j]);
sum += gussian[i][j];
}
}
cout << sum << endl;
for (i = 0; i<N; i++)
{
for (j = 0; j<N; j++)
{
gussian[i][j] = gussian[i][j] / sum;
printf("%f ,", gussian[i][j]);
}
printf("\n");
}
}