平均池化与最大池化
问题描述:将彩色图像进行平均池化与最大池化
代码如下(示例):
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <math.h>
// average pooling
cv::Mat average_pooling(cv::Mat img) {
int width = img.cols;
int height = img.cols;
int channel = img.channels();
int win_size = 8;
int val = 0;
cv::Mat new_image = cv::Mat::zeros(height, width, CV_8UC3);
for (int i = 0; i < height; i += win_size)
{
for (int j = 0; j < width; j += win_size)
{
for (int c = 0; c < channel; c++)
{
val = 0;
for (int di = 0; di < win_size; di++)
{
for (int dj = 0; dj < win_size; dj++)
{
// val += (double)img.at<cv::Vec3b>(i + di, j + dj)[c]; // 平均池化
val = fmax(img.at<cv::Vec3b>(i + di, j + dj)[c], val); // 最大池化
}
}
// val /= (win_size * win_size); // 平均池化
for (int di = 0; di < win_size; di++)
{
for (int dj = 0; dj < win_size; dj++)
{
new_image.at<cv::Vec3b>(i + di, j + dj)[c] = (uchar)val;
}
}
}
}
}
return new_image;
}
int main(){
// read image
cv::Mat img = cv::imread("../imori.jpg", cv::IMREAD_COLOR);
// average pooling
cv::Mat new_image = average_pooling(img);
// cv::imwrite("../1-10/imori1.jpg", new_image); // 平均池化
// cv::imshow("imori1", new_image); // 平均池化
cv::imwrite("../1-10/imori2.jpg", new_image);
cv::imshow("imori2", new_image);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
输入图像 (imori.jpg) | 平均池化图像 (imori1.jpg) | 最大池化图像 (imori2.jpg) |
---|---|---|
平均池化与最大池化
将图片使用均等大小网格分割,并求网格内代表值的操作称为池化(Pooling)。
平均池化是将图片按照固定大小网格分割,网格内的像素值取网格内所有像素的平均值的池化操作。
池化操作是**卷积神经网络(Convolutional Neural Network)**中重要的图像处理方式。平均池化按照下式定义:
v
=
1
∣
R
∣
∑
i
=
1
R
v
i
v=\frac{1}{|R|}\ \sum\limits_{i=1}^R\ v_i
v=∣R∣1 i=1∑R vi
最大池化是将图片按照固定大小网格分割,网格内的像素值取网格内所有像素的最大值的池化操作。