图像一维度化

[toc]

灰度图像一维化

众所周知 灰度图像是由元素数值在 [0,255] 范围内的矩阵构成的,因此可以将一个nm的矩阵(分辨率nm)变成一个向量,即图像一维化。
常见的彩色图像由RGB三个通道组成(即有3个m*n的矩阵),因而操作其实也是类似的,三个通道分别处理再叠加即可。

直接拉伸

在图像处理中,有时候需要将图像拉抻成向量进行处理。上matlab代码

file_path = 'D:\train_data\';% 需要一维化图像的文件夹路径 
img_path_list = dir(strcat(file_path,'*.jpeg'));%获取该文件夹中所有jpeg格式的图像
img_num = length(img_path_list);%获取图像总数量
data=zeros(img_num,600);            %创建零矩阵,大小为img_num*600,600自己按需修改
I=cell(1,img_num);
if img_num > 0 %有满足条件的图像
            for j = 1:img_num %逐一读取图像 
                 image_name = img_path_list(j).name;% 图像名 ?
                 image = imread(strcat(file_path,image_name)); 
                 I{j}=image;
                 fprintf('%d %d %s\n',i,j,strcat(file_path,image_name));% 显示正在处理的图像名 ?
                    
                 %图像处理过程
                 image_grey = rgb2gray(image);      %将RGB图像转换成灰度图
                 [m,n]=size(image_grey);            %获取图片分辨率大小,大小为m*n
                 B = reshape(image_grey,1,m*n);     %根据图像分辨率拉伸成为长度m*n的向量
                 data(j,1:m*n) = B;
            end 
            
end
xlswrite( "D:\ONE.xlsx",data)  %将一维化之后的图像数据保存为xlsx文件

希尔伯特曲线法

相比直接拉伸,用希尔伯特曲线的方法将图像一维化可以保留图像结构特征

%leftright.m
function [y] = leftright(x)
    sizecol = size(x, 2);
    y = zeros(sizecol);
    for i = 1 : sizecol
        y(:, i) = x(:, sizecol + 1 - i);
    end
end
% show_curve.m
function show_curve(H)
size_col = size(H, 2);
map = zeros(size_col * size_col, 3);
count = 1;
for i = 1 : size_col
    for j = 1 : size_col
        map(count, 1) = i;
        map(count, 2) = j;
        map(count, 3) = H(i, j);
        count = count + 1;
    end
end
map = sortrows(map, 3);
plot(map(:,1), map(:, 2));
axis([0 size_col + 1 0 size_col + 1]);
end

H2 = [1 2; 4 3];
H = H2;
for i = 1 : 9
    if mod(i, 2) == 0
        H = [H, 4^i + H';
             (4^(i + 1) + 1) - updown(H), (3 * 4^i + 1) - (leftright(H)')];
    else
        H = [H, (4^(i + 1) + 1) - leftright(H); 
            (4^i) + H', (3 * 4^i + 1) - leftright(H')];
    end
    H
end
% updwon.m
function [y] = updown(x)
    sizerow = size(x, 1);
    y = zeros(sizerow);
    for i = 1 : sizerow
        y(i, :) = x(sizerow + 1 - i, :);
    end
end

致谢

@ClayLiu

参考资料

Hilbert曲线扫描矩阵的生成算法及其MATLAB程序代码

你可能感兴趣的:(图像一维度化)