这是我参与更文挑战的第1天,活动详情查看: 更文挑战
基础知识
我们先从结构开始了解,一张图片的结构分为: 文件标识 和 数据块,如下图
文件标识里面包含了 文件签名、维度、高度、宽度、深度、通道数、颜色格式、数据首地址、结束地址、数据量等重要信息.
那么问题来了,512Bytes的16位图的正方形图片大概是多少宽高,像素如果是整数,取值范围为多少呢?
这里就涉及到一个重要的概念,图像深度.所谓的图像深度,是指存储每个像素的所占用的位数,当一个像素占用了的像素越多时候,我们能感受到的是这个地方色彩越鲜艳,而我们经常说的归一化后灰度化处理图片,是所谓降低这个像素值.
现在回来,再看看我们的问题,得知宽高一样,假定是8位色彩,512 / 16 * 8=256,再开根,得到是16*16的16位图. 取值范围等于2的8次方,0~256. 此时,我们的图片像素值矩阵,打个比方如下所示(示例特定指定的数据,非实际数据):
我们如果能把这原始图像缩小至44,是不是已经压缩了存储空间?那么我们该怎样计算呢? 公式按 MN分成一个区域,各项像素值为向量,进行向量和,即:X1+X2+....+X(MN) 再把向量和除以当前位图数,即 (X1+X2+....+X(MN))/16; (67+187+56++198+77+8+28+188+168+213+140+189+231+67+204+20)/16约等整数127
实践-使用OpenCV缩放图片
Opencv里面缩放函数定义为
void resize(InputArray shur, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
即(输入矩阵,输出矩阵,输出图像的大小(注意:当此值为0,后面fx,fy不能同时为0),X轴缩放系数,Y轴缩放系数,插值方式(默认为线性插值,可选有最近邻插值、区域插值、三次样条插值、Lanczos插值))
此案例算法建立在线性插值场景上
代码如下:
Mat inImage = imread("案例输入.jpg");
Mat tmpImage,outImage;
tmpImage=inImage;
imshow("输入的原始图像", inImage);
resize(tmpImage,outImage,Size(4,4),(0,0),(0,0));
imshow("缩放后的图像", outImage);