想快速入门图像处理的小伙伴们!跟着步伐我们一起闯关吧!一定会收获满满哦!
为图像处理初学者设计的 100 个问题。这里感谢@gzr2017的翻译,然后我也将随作者的脚步逐一学习实现100道算法题,大家可以一起学习哦,加油!坚持!持续更新中哦!!!
问题6-10:
- 问题六:减色处理
- 问题七:平均池化(Average Pooling)
- 问题八:最大池化(Max Pooloing)
- 问题九:高斯滤波(Gaussian Filter)
- 问题十:中值滤波(Median filter)
代码实现:
- 问题六:减色处理
我们将图像的值由 25 6 3 256^3 2563压缩至 4 3 4^3 43,即将 RGB \text{RGB} RGB的值只取 32 , 96 , 160 , 224 {32, 96, 160, 224} 32,96,160,224。这被称作色彩量化。色彩的值按照下面的方式定义: val = { 32 ( 0 ≤ var < 64 ) 96 ( 64 ≤ var < 128 ) 160 ( 128 ≤ var < 192 ) 224 ( 192 ≤ var < 256 ) \text{val}= \begin{cases} 32& (0 \leq \text{var} < 64)\\ 96& (64\leq \text{var}<128)\\ 160&(128\leq \text{var}<192)\\ 224&(192\leq \text{var}<256) \end{cases} val=⎩⎪⎪⎪⎨⎪⎪⎪⎧3296160224(0≤var<64)(64≤var<128)(128≤var<192)(192≤var<256)
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
//#include <math.h>
using namespace cv;
Mat decrease_color(Mat img)
{
int height = img.rows;
int width = img.cols;
Mat out = Mat::zeros(height, width, CV_8UC3);
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
for (size_t i = 0; i < img.channels(); i++)
{
out.at<Vec3b>(y, x)[i] = ((img.at<Vec3b>(y, x)[i] / 64) * 64 + 32);
}
}
}
return out;
}
int main(int argc, const char* argv[])
{
Mat img = imread("D:/文件/lenna.png");
Mat out = decrease_color(img);
imshow("img", img);
imshow("out", out);
waitKey(0);
destroyAllWindows();
return 0;
}
输入:
输出:
- 问题七:平均池化(Average Pooling)
将图片按照固定大小网格分割,网格内的像素值取网格内所有像素的平均值。
我们将这种把图片使用均等大小网格分割,并求网格内代表值的操作称为池化(Pooling)。
池化操作是**卷积神经网络(Convolutional Neural Network)**中重要的图像处理方式。平均池化按照下式定义: v = 1 ∣ R ∣ ∑ i = 1 R v i v=\frac{1}{|R|}\ \sum\limits_{i=1}^R\ v_i v=