输入:步长,图像
过程:依次读取图像块的灰度值
输出: 每个图像块的像素值都是排成一列的值再拼接起来 400*40*31
补充: matlab处理完图像矩阵后,用imshow()显示图像时若是double型,输出的图像部分区域会显示白色。因为imshow()显示图像时,认为double型数据位于(0,1),对于数组中大于1的元素,会将其归为1,显示为白色。inshow()显示图像时,对于图像数组为uint8型数据的情况,显示的范围是0~255。所以,对于0~255范围的double图像数组,要想正常显示,要么除以255进行归一化处理,要么将其转换成uint8型图像数组显示。
所以matlab中读入图像的数据类型是uint8,但图像矩阵运算时的数据类型是double类型。这么做一是为了保证精度,二是如不转换,在对uint8进行加减时会溢出。做矩阵运算时,uint8类型的数组间可以相互运算,结果仍是uint8类型的;uint8类型数组不能和double型数组作运算。
所以,unit8转换为double类型后,没太大变化,只是为了方便运算,转换为double,但是由于imshow函数原因,显示出来的东西会不一样。
介绍一下yCbCr的功能:这样显示出来的是YcbCr色彩空间的图片,我们只取Y分量作为新的图片的三个分量合成,得到的即是这幅彩色图片的灰度图 ,Y表示颜色的明亮度和浓度,而Cb和Cr则分别表示颜色的蓝色浓度偏移量和红色浓度偏移量,详见后面的补充
a(:)是把矩阵a转换为一个列项咧,就是一列
% 整体函数是实现把图像分为图像块后读取每个图像块的像素值并拼接起来
% im是读取的转变为灰度图像的测试照片的矩阵,b是图像块的长度,s是步长step
function [Patches] = Get_patches( im,b,s )
%-------------------------------------------------------------------------
% This function divide the input image into some patches size of bxb
% 分块为b*b类型
% im: input image
% b: the size of each patch
% s: s = b - overlap
% Patches: b^2 x nrow x ncol where nrow is the number of patches each
% row, ncol is the number of patches each column; Patches(:,i,j) denotes
% the patch located in ith row, jth column
%-------------------------------------------------------------------------
[h w ch] = size(im); % 行数=高,h=250;w=200;ch=3
% 转换为unit8格式,第一维的数据,为啥不是灰度格式?
if ch==3
tempim = rgb2ycbcr( uint8(im) );
im = double( tempim(:,:,1));
end
% r=row行 c=column列
N = h-b+1;
M = w-b+1;
r = [1:s:N]; % 移动步长看每一列有多少个块,r就是图像块的行数,其实是一个矩阵,每一个表示图像块的位置
if r(end) == N
;
else
r = [r N]; % 只加上最后一个块
end
% r = [r r(end)+1:N]; % 依次加一个块
c = [1:s:M];
if c(end) == M
;
else
c = [c M];
end
% c = [c c(end)+1:M]; % 同理c表示图像块的列数,其实是一个矩阵,每一个表示图像块的位置
L = length(r)*length(c); % 计算图像块个数
% Patches = zeros(b*b, L, 'double');
Patches = zeros(b*b,length(r),length(c));% 先定义Patches格式,三维的,对应的值
for i = 1:length(r)
for j = 1:length(c) % 某一行的所有图像块的操作
blk = im(r(i):r(i)+b-1,c(j):c(j)+b-1); % 对应的图像的值,是20*20
blk = blk(:); % 读入图像的像素信息 拼接为400*1的一列了
Patches(:,i,j) = blk; % 读入每一个对应i,j 的一串值
% Patches(:,(i-1)*length(c)+j) = blk;
end
end
YCbCr的图片显示
im = imread(fullfile(tepath,filelist(1).name));
tempim = rgb2ycbcr( uint8(im) );
imo = double( tempim(:,:,1));
这里是使用的素描图像产生的结果,它根本不是RGB图像呀:
写了一段代码,来更直观以图片形式显示一下生成的结果:
im = imread(fullfile(tepath,filelist(1).name));
figure; subplot(3,1,1);imshow(im);
tempim = rgb2ycbcr( uint8(im) );
subplot(3,1,2);imshow(tempim);
im0 = double( tempim(:,:,1));
subplot(3,1,3);imshow(im0);
Patches结果类似如下:
blk的变化:
最终的输出: