在分析照片各个区域的色度、亮度平均值时,为了使每行/每列/整体的像素点特征分布均匀以加快分析速度、减小误差时,这时候就要对像素点进行随机化操作,也就是洗牌。
用Matlab来完成此任务再合适不过了。对于RGB类型的彩色图片,它在Matlab中本质上是个三维矩阵,这个三维数组有三个面,依次对应于红(Red)、绿(Green)、蓝(Blue)三种颜色,而面中的数据则分别是这三种颜色的强度值,面中的元素对应于图像中的像素点。设所得矩阵为X三维矩阵(height,width,3) ,X(:,:,1)代表红色的二维矩阵 X(:,:,2)代表绿色的二维矩阵, X(:,:,3)代表蓝色的二维矩阵。
那么这里用到两个Matlab内置函数:一个是randperm(x),产生1~x的随机序列并作为行向量,输入原图像中要进行转置操作才可以;另一个是size(a,n),n=1时求矩阵a的行数,n=2时求矩阵a的列数。下面直接上代码:
clc; %
close all;
[a,b] = uigetfile({'*.jpg';'*.png'},'Please select an image'); % open file choice dialogif ~(a == 0)img = imread(strcat(b,a));img0(1:size(img,1),1:size(img,2),:)=img(randperm(size(img,1))',randperm(size(img,2))',:); % shuffle bothimg1(:,1:size(img,2),:)=img(:,randperm(size(img,2))',:); % shuffle columnsimg2(1:size(img,1),:,:)=img(randperm(size(img,1))',:,:); % shuffle linesimwrite(img0, strcat('0_', a));imwrite(img1, strcat('1_', a));imwrite(img2, strcat('2_', a));
end
其中img0是行、列都随机化(如下图右上角所示),img1只随机化列(如下图左下角所示),img2只随机化行(如下图右下角所示),效果如下:
当然缺点也很明显, 处理分辨率过高的图片时工作区内存会不足,而且对于索引等类型的图片需要转为RGB以后才能使用。