我是靠谱客的博主 唠叨缘分,最近开发中收集的这篇文章主要介绍1.调试代码的过程ing,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

这是一个后处理的代码,可以实现把文件夹里的人脸照片批量变成生成素描,还会显示SSIM(也就是类似于生成素描和真实素描的相似度)的值,我希望把它调试成可以选择输入一张图片然后处理为生成素描,然后匹配真实数据库中的真实素描。这样一个动态的结果。

但是想法很行空,我遇到了一些问题,如下记录:

首先,我看不懂里面的代码,即使只是matlab,我现在的计划是慢慢调试,

  • 先大概说一下我对这个代码的整体认识,,它有一个例程,可以实现之前说的批量处理人脸照片为生成素描的Example,然后主要就是有一些函数来实现,由于是malab的,整体代码量十分轻巧,但是我还需要回顾一下对malab的基础知识,哭蓼,我忘了好多。但是又感觉好像没有多少。
  • 这里再来补充一些我自己不太清楚搜索得到的一些matlab基础命令知识.
  1. clc是清除当前command区域的命令,也就是之前命令产生的结果
  2. 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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部