概述
这是一个后处理的代码,可以实现把文件夹里的人脸照片批量变成生成素描,还会显示SSIM(也就是类似于生成素描和真实素描的相似度)的值,我希望把它调试成可以选择输入一张图片然后处理为生成素描,然后匹配真实数据库中的真实素描。这样一个动态的结果。
但是想法很行空,我遇到了一些问题,如下记录:
首先,我看不懂里面的代码,即使只是matlab,我现在的计划是慢慢调试,
- 先大概说一下我对这个代码的整体认识,,它有一个例程,可以实现之前说的批量处理人脸照片为生成素描的Example,然后主要就是有一些函数来实现,由于是malab的,整体代码量十分轻巧,但是我还需要回顾一下对malab的基础知识,哭蓼,我忘了好多。但是又感觉好像没有多少。
- 这里再来补充一些我自己不太清楚搜索得到的一些matlab基础命令知识.
- clc是清除当前command区域的命令,也就是之前命令产生的结果
- clear用于清空环境变量,也就是之前的旧的变量值
- 附上源代码,来一步一步分析
第一部分-整体代码分析:
1.初始化部分,以及定义一些常数的值
clc;
clear;
close all;
addpath('Codes');
% 首先,添加路径Code,里面放的都是写好的一些相关的函数;
% Sketch synthesis or photo synthesis
photo2sketch = true;
% photo2sketch我还不知道这个有什么作用,因为我改为false后出来的结果变化不大,虽然没有等到处理完一张图片的结果;?
%设置一些常量:
Database = 'CUHK Student';
% Database这里赋值,可以说省却如果要改数据集的时候,后面路径一堆要改的麻烦,注意加上单引号,表示字符串;
patchsize = 20;
% patchsize是指后面要划分图像块的时候它那个图像块的大小的边长,图像块是正方形的哈
overlap = 14;
% overlap中文意思是重叠?
searchregion = 5;
% searchregion暂时不懂?
NN = 5;
% NN暂时不懂?
step = patchsize - overlap;
% step意思是步长,这里的计算是用图像块长度-重叠部分长度,我的猜测哈?
trpathphoto = ['Data/',Database,'/Photo/Training/Photo/',];
% training path photo 训练照片路径
trpathsketch = ['Data/',Database,'/Sketch/Training/'];
% training path sketch 训练素描路径
tepath = ['Data/',Database,'/Photo/Testing/'];
% test path 测试照片路径
tarpath = ['Data/',Database,'/Sketch/Testing/'];
% target path 测试素描路径
repath = ['Data/',Database,'/Result/'];%生成素描结果
% result path 生成素描路径
dicpath = ['Data/',Database,'/Dictionary/'];
% dictionary path 字典路径?
2.读入数据部分,readImage函数和dir函数功能类似,后面可以考虑减少这个函数换为内置函数
% readImageNames读出的信息与dir类似,有name folder date bytes isdir datenum 88*1 struct88是指训练集中有88张图片的结构体 有6个变量
filelist_p = readImageNames(trpathphoto); % 读入训练照片路径全部信息 88*1
filelist_s = readImageNames(trpathsketch); % 读入训练素描路径全部信息 88*1
filelist = readImageNames(tepath); % 读入测试照片路径全部信息 100*1
filelist_ref = readImageNames(tarpath); % 读入真实测试素描路径全部信息? 100*1
filelist的类型:其实就是在第一部分函数里面提到的dir的结果类型一样,它的size是文件夹里图片的个数;
name部分只是图片的相对路径(名称),不是绝对路径,加上folder部分才算是绝对路径。
% trainingImageRead返回的是double类型的图像数据 200*250的尺寸,但是返回的是250*200=行*列的个数呀,就是矩阵的维度呀
[imp ims] = trainingImageRead(trpathphoto,trpathsketch,filelist_p,filelist_s);% 读入训练p-s对的路径及所有文件的名字,
% 返回的是所有图片的灰度值信息
% 定义矩阵形式并初始化测试照片消耗时间及每张照片的SSIM值初始化定义 100*1 double类型
Time_Consuming = zeros(length(filelist),1);
SSIM_Score = zeros(length(filelist),1);
% 开始循环
for i = 1:length(filelist)
fprintf('nProcessing %s...n',filelist(i).name); % 输出正在处理的图片名称
filename = fullfile(repath,filelist(i).name(1:end-4));% 读入,后面的name那些是不包括.jpg这个后缀的实现
im = imread(fullfile(tepath,filelist(i).name)); % 读取完整路径,包括后缀,读取图片
tic; % 开始计算时间
[height width ch] = size(im); % 处理三维图片输入,size返回它的维度,原来是高*宽
if ch == 3
tempim = rgb2gray(im);
im = double(tempim);%把测试照片也转换为double类型
else
im = double(im);
end
Patches = Get_patches(im,patchsize,step);%获得图像块400*行*列,也是size返回的值
[dim,h,w] = size(Patches);
[path string ~] = fileparts(filelist(i).name);%获得 路径,文件名,扩展名 ;波浪线表示忽略
[candidates] = neighborSelect(h,w,length(filelist_p),patchsize,...
step,searchregion,height,width,NN,Patches,imp,ims,photo2sketch);
k = 1;
Rpatches = [];
for jj = 1:w
for ii = 1:h
Rpatches(:,k) = candidates(ii,jj).patches'*candidates(ii,jj).W;
k = k+1;
end
end
Im = FusionAve(height,width,patchsize,overlap,Rpatches);
Im = uint8(Im);
Time_Consuming(i) = toc;
rim = imread([tarpath,filelist_ref(i).name]);
if size(rim,3) == 3
rim = rgb2gray(rim);
end
% 比较合成结果的SSIM
SSIM_Score(i) = ssim(rim,Im);
imwrite(Im,[filename,'.jpg'],'quality',100);
fprintf('Elasped time is %fn',Time_Consuming(i));%显示合成需要的时间
fprintf('SSIM score is %fn',SSIM_Score(i));
end
%显示平均需要花费的时间
fprintf('The mean SSIM Score on the %s database is %fn',Database,...
mean(SSIM_Score));
fprintf('The mean time-consuming on the %s database is %fn',...
Database,mean(Time_Consuming));
save([repath,'SSIM_Time.mat'],'SSIM_Score','Time_Consuming');%保存为.mat文件
补充解释:
Matlab的rgb2gray函数采用的是对R、G、B分量进行加权平均的算法:
0.2989R+ 0.5870G + 0.1140B
测试代码:
imp = imread(fullfile(trpathphoto,filelist_p(1).name));
imp0 = rgb2gray(imp);
imp1(:,:,1) = double(imp0);
im=imread(fullfile(trpathphoto,filelist_p(1).name));
[h w ch] = size(im);
if ch==3
tempim = rgb2ycbcr( uint8(im) );
imp2 = double( tempim(:,:,1));
end
这一段测试代码 的输出结果表明-二者函数是不一样的:imp1和imp2中存储的值是不同的
但是,我尝试了一下,生成的结果区别是不大的,嗯。
补充:
filename这里的输出,就是咩有后缀的路径,所有名称,除去.jpg
一个正常的结果:
最后
以上就是唠叨缘分为你收集整理的1.调试代码的过程ing的全部内容,希望文章能够帮你解决1.调试代码的过程ing所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复