文章目录
- 文章概要
- 算法原理
- 程序架构
- 代码实现
- 注意事项
文章概要
图像降采样(Image Downsampling)是指通过减少图像像素数量来降低图像分辨率的过程。
这一过程在图像处理中非常重要,主要用于以下几个方面:
- 减少存储空间和计算资源:降低图像分辨率可以减少图像文件的大小,从而节省存储空间。同时,处理低分辨率图像所需的计算资源也相对较少,可以提高图像处理和分析的效率。
- 生成缩略图:在网页浏览、图像管理软件等应用中,生成缩略图可以快速预览大量图像,提高用户体验。
- 特征提取:在计算机视觉和机器学习中,降采样可以用于提取图像的主要特征,去除噪声和细节,从而简化后续的分析和识别任务。
以下是一个基于MATLAB的8K(7680×4320)12bit图像降采样为1080p(1920×1080)12bit图像的程序,保留12bit有效数据并进行降采样,分别进行简单降采样与高质量降采样,并进行对比。
算法原理
简单降采样的原理
简单降采样将距离输出图像像素最近的输入图像像素值作为输出像素值。这种方法简单高效,但可能会导致图像出现锯齿状的边缘。本程序中在4*4的像素区域中,直接选取第个像素为采样像素。
高质量降采样的原理
高质量降采样通过计算输出像素及周围共16个输入像素的加权平均值来得到输出像素值。这种方法可以得到更高质量的图像,但计算量较大。本程序中在4*4的像素区域中,计算16个输入像素的均值为采样像素。
程序架构
简单降采样代码说明 :
- 简单快速降采样:
每个4×4块直接取第一个像素;
处理速度比区域平均法快约4倍。 - 保持原始数据:
不引入插值或平均计算;
保留原始像素值。 - 定位规则:
从每个块的(1,1)位置取样;
保证取样位置的一致性。
高质量降采样代码说明 :
- 高质量降采样:
采用区域平均算法,每个1080p像素对应8K图像的4×4区域的平均值;
相比简单抽取,能更好保留图像细节和减少混叠。 - 边界处理:
自动处理图像边界区域;
保证输出图像严格为1920×1080分辨率。 - 内存优化:
按行处理大图像,减少内存占用。
输入输出:
◦ 输入包括目标8K图像文件(input_path),为 7680x4320 分辨率、16 位位深的 RAW 格式图像。(有效位深为12位,即饱和值为4095)。
◦ 输出为降采样后的 RAW 文件(output_path),为1080p分辨率。
代码实现
MATLAB代码简单降采样实现如下:
clc;clear;tic;%基于MATLAB的8K(7680×4320)12bit图像降采样为1080p(1920×1080)12bit图像的程序,保留12bit有效数据并进行简单降采样% 将8K图像降采样为1080pdownsample_8k_to_1080p('Image1_8K.raw','Image1_1080p_sub.raw');functiondownsample_8k_to_1080p(input_path,output_path)% 参数说明:% input_path: 输入的8K RAW格式图像文件路径% output_path: 输出的1080p RAW格式图像路径% 图像参数width_8k=7680;% 8K图像宽度height_8k=4320;% 8K图像高度width_1080p=1920;% 1080p图像宽度height_1080p=1080;% 1080p图像高度bit_depth=16;% 文件存储位深effective_bits=12;% 有效位深block_size=4;% 降采样块大小% 读取8K RAW图像fid=fopen(input_path,'rb');iffid==-1error('无法打开输入文件');endimg_8k=fread(fid,[width_8k,height_8k],'uint16');fclose(fid);% 转换为双精度浮点以便处理img_8k=double(img_8k);% 计算降采样比例ratio_x=width_8k/width_1080p;% 水平降采样比例 (4:1)ratio_y=height_8k/height_1080p;% 垂直降采样比例 (4:1)% 初始化1080p图像img_1080p=zeros(width_1080p,height_1080p);% 简单降采样:每个4x4块取第一个像素fory=1:height_1080pforx=1:width_1080p% 计算8K图像中对应的位置x_8k=(x-1)*block_size+1;y_8k=(y-1)*block_size+1;% 直接取第一个像素值img_1080p(x,y)=img_8k(x_8k,y_8k);endend% 保存1080p图像fid=fopen(output_path,'wb');iffid==-1error('无法创建输出文件');endfwrite(fid,img_1080p,'uint16');fclose(fid);disp(['降采样完成!1080p图像已保存至: 'output_path]);endMATLAB代码高质量降采样实现如下:
clc;clear;tic;%基于MATLAB的8K(7680×4320)12bit图像降采样为1080p(1920×1080)12bit图像的程序,保留12bit有效数据并进行高质量降采样% 将8K图像降采样为1080pdownsample_8k_to_1080p('Image1_8K.raw','Image1_1080p.raw');functiondownsample_8k_to_1080p(input_path,output_path)% 参数说明:% input_path: 输入的8K RAW格式图像文件路径% output_path: 输出的1080p RAW格式图像路径% 图像参数width_8k=7680;% 8K图像宽度height_8k=4320;% 8K图像高度width_1080p=1920;% 1080p图像宽度height_1080p=1080;% 1080p图像高度bit_depth=16;% 文件存储位深effective_bits=12;% 有效位深% 读取8K RAW图像fid=fopen(input_path,'rb');iffid==-1error('无法打开输入文件');endimg_8k=fread(fid,[width_8k,height_8k],'uint16');fclose(fid);% 转换为双精度浮点以便处理img_8k=double(img_8k);% 计算降采样比例ratio_x=width_8k/width_1080p;% 水平降采样比例 (4:1)ratio_y=height_8k/height_1080p;% 垂直降采样比例 (4:1)% 初始化1080p图像img_1080p=zeros(width_1080p,height_1080p);% 高质量区域平均降采样fory=1:height_1080pforx=1:width_1080p% 计算8K图像中对应的区域x_start=floor((x-1)*ratio_x)+1;x_end=floor(x*ratio_x);y_start=floor((y-1)*ratio_y)+1;y_end=floor(y*ratio_y);% 提取区域并计算均值region=img_8k(x_start:x_end,y_start:y_end);img_1080p(x,y)=mean(region(:));endend% 保存1080p图像fid=fopen(output_path,'wb');iffid==-1error('无法创建输出文件');endfwrite(fid,img_1080p,'uint16');fclose(fid);disp(['降采样完成!1080p图像已保存至: 'output_path]);end输出的图像处理前后对比示例如下:
从左至右分别是:8K原图、1080p简单降采样图、1080p高质量降采样图,可以看到整体略缩图并无区别,物体信息没有偏差。
8K原图区域细节图如下所示:
1080p简单降采样图区域细节图如下所示:
1080p高质量降采样图区域细节图如下所示:
可以看到同视场下原始图像到降采样图像细节丢失严重。
但高质量降采样比简单降采样图像线条连续、明暗过渡更加自然。
8K原图一些区域的坏点、噪点如下所示:
在1080p简单降采样图得到了一些保留及放大,如下所示:但在1080p高质量降采样图中被处理掉了,起到了滤波降噪的效果,如下所示:
注意事项
简单降采样注意事项:
这种方法可能会导致图像出现锯齿现象。
适合对处理速度要求高、对图像质量要求不苛刻的场景。
如需更好质量但稍慢的处理,可使用高质量降采样方法。
取样位置固定为块左上角,如需中心像素可修改x_8k/y_8k的计算公式。
如果需要选择其他取样位置(如中心像素),只需修改以下代码部分:
% 改为取4x4块的中心像素x_8k=(x-1)*block_size+floor(block_size/2);y_8k=(y-1)*block_size+floor(block_size/2);高质量降采样注意事项:
如需处理不同分辨率,需调整代码中的尺寸参数。
对于超大图像处理可能需要较长时间(约1-2分钟)。
如需进一步优化处理速度,可以考虑使用MATLAB的并行计算功能(parfor)或GPU加速。