matlab | 实现图像复原 / 超分重建 / 去模糊 论文里的局部放大对比图

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/u014722627/article/details/79817074

效果

  • 鼠标选择bounding box 左上角位置
    鼠标选择左上角的点

  • 生成的图。该脚本以bounding box大小为基准,调整大图的大小。贴到论文里比较好看
    这里写图片描述
    这里写图片描述

文件存放形式

以图片1.jpg为例,原图存放在root文件夹,用3种方法的处理结果存放在method1method2method3子文件夹,matlab代码drawcompare.m放在root文件夹。

——root:1.jpg drawcompare.m
|————method1: 1.jpg
|————method2: 1.jpg
|————method3: 1.jpg

代码

drawcompare.m

用法:
1. 按照文件存放形式放好待比较图像
2. 运行函数代码(若报错“方框数量太多”,请减少方框数量,重新运行函数)

 函数参数分别为:
 imname:图像文件名
 fixw:(正方形)方框边长(默认为40)
 margine:留白大小(默认为10)
 nbox:方框数量(默认为2)

3. 点击图像选择方框左上角,按下回车确认(若报错“超出了图像范围”,请重新运行函数,小心的选择位置)
4. 生成的图像会保存在该代码所在目录

function []=drawcompare(imname,fixw,margine,nbox)
%input:
% imname: string image filename eg: 'street.jpg'
% fixw: bounding box size for zoom in
% margine: margine between picture elements
% nbox: number of bounding boxs
%usage:
% 1.put the origine image in the root dir
% 2.put the images (to be compared, having same file name as the origine 
% image) in different sub dir,
% 3.click the image and press enter to confirm your bounding boxs (2 box in
% this program)
% 4.new image will be save to root dir

%------------------sub dir, modify by user--------------------------------- 
me_dir = './ME';
pan_dir = './PAN';
xu_dir = './XU';
sun_dir = './SUN';
ori_dir = '.';
method_dir_list={ori_dir,me_dir,pan_dir,sun_dir,xu_dir};

%-----------------default params-------------------------------------------
if (nargin<2 || fixw<=0)
    fixw=40; margine=10;
end
if (nargin<3 || margine<=0)
    margine=10;
end
if (nargin<4 || nbox>6)
    nbox=2;
end

%------------------计算各种大小--------------------------------------------
% 这里设resize后发img宽为patch的scale倍,scale=5
scale=5;
imme = imread(fullfile(me_dir,imname));
[h,w,c]=size(imme);
imme_re = imresize(imme,[NaN,fixw*scale]);
[hr,wr,~]=size(imme_re);
assert(hr>fixw*nbox+(nbox-1)*margine/2,'error: too many nbox!')
wrr = wr+margine+fixw;% width + pad + patch
imall_final = 255*uint8(ones(hr,length(method_dir_list)*(wr+margine+fixw),3));
imone_final = 255*uint8(ones(hr,wr+margine+fixw,3));

%-------------------获取框的位置 set boundingbox---------------------------
figure(1)
axis image;
set(gcf,'WindowStyle','normal')
set(gcf,'unit','pixels','Position',[300,300,w,h]);
imshow(imme,'border','tight','initialmagnification','fit');  %图像填充figure
point_cell={};
for i=1:nbox
    [x,y]=ginput;
    x=int32(ceil(x(end)));y=int32(ceil(y(end)));
    rectangle('Position',[x y fixw fixw],'LineWidth',1,'EdgeColor','r')
    point_cell{i}=[x,y];
end
%------------------在原图画框 draw boundingbox-----------------------------
colors=lines(nbox);
% red yellow blue pink cyan orange 

for i=1:length(method_dir_list)

    im = imread(fullfile(method_dir_list{i},imname));
    im_rect = im;
    for j=1:length(point_cell)
        x = point_cell{j}(1);
        y = point_cell{j}(2);
        im_rect=drawRect(im_rect,[x,y],[fixw,fixw],1,color(j,:);
        % 裁剪框的部分
        im_crop=imcrop(im_rect,[x y fixw fixw]);
        % 调整原图大小 贴到最终图
        imone_final(hr-j*fixw-(j-1)*margine/2:1:hr-(j-1)*fixw-(j-1)*margine/2,...
            wr+margine/2:1:wr+margine/2+fixw,:) = im_crop;
    end
    imone_final(1:1:hr,1:1:wr,:) = imresize(im_rect,[hr,wr]);
    imall_final(:,(i-1)*wrr+1:1:i*wrr,:)=imone_final;
end

figure(2),imshow(imall_final)
imwrite(imall_final,['all' imname]);

end
function [ dest ] = drawRect( src, pt, wSize,  lineSize, color )
% 转载自 http://blog.csdn.net/humanking7/article/details/46819527
% 简介:
% %将图像画上有颜色的框图,如果输入是灰度图,先转换为彩色图像,再画框图
% 图像矩阵
% 行向量方向  是  y
% 列向量方向  是  x
%----------------------------------------------------------------------
%输入:
% src:        原始图像,可以为灰度图,可为彩色图
% pt:         左上角坐标   [x1, y1]
% wSize:   框的大小      [wx, wy]
% lineSize: 线的宽度
% color:     线的颜色      [r,  g,  b] 
%----------------------------------------------------------------------
%输出:
% dest:           画好了的图像
%----------------------------------------------------------------------

%flag=1: 有缺口的框
%flag=2: 无缺口的框
flag = 1;


%判断输入参数个数
if nargin < 5
    color = [255 255 0];
end

if nargin < 4
    lineSize = 1;
end

if nargin < 3
    disp('输入参数不够 !!!');
    return;
end

%判断框的边界问题
[yA, xA, z] = size(src);
x1 = pt(1);
y1 = pt(2);
wx = wSize(1);
wy = wSize(2);
if  x1>xA || ...
        y1>yA||...
        (x1+wx)>xA||...
        (y1+wy)>yA

    disp('画的框将超过图像 !!!');
    return;
end

%如果是单通道的灰度图,转成3通道的图像
if 1==z
    dest(:, : ,1) = src;
    dest(:, : ,2) = src;
    dest(:, : ,3) = src;
else
    dest = src;
end

%开始画框图
for c = 1 : 3                 %3个通道,r,g,b分别画
    for dl = 1 : lineSize   %线的宽度,线条是向外面扩展的
        d = dl - 1;
        if  1==flag %有缺口的框
            dest(  y1-d ,            x1:(x1+wx) ,  c  ) =  color(c); %上方线条
            dest(  y1+wy+d ,     x1:(x1+wx) , c  ) =  color(c); %下方线条
            dest(  y1:(y1+wy) ,   x1-d ,           c  ) =  color(c); %左方线条
            dest(  y1:(y1+wy) ,   x1+wx+d ,    c  ) =  color(c); %左方线条
        elseif 2==flag %无缺口的框
            dest(  y1-d ,            (x1-d):(x1+wx+d) ,  c  ) =  color(c); %上方线条
            dest(  y1+wy+d ,    (x1-d):(x1+wx+d) ,  c  ) =  color(c); %下方线条
            dest(  (y1-d):(y1+wy+d) ,   x1-d ,           c  ) =  color(c); %左方线条
            dest(  (y1-d):(y1+wy+d) ,   x1+wx+d ,    c  ) =  color(c); %左方线条
        end
    end    
end %主循环尾


end %函数尾



Ref

画框函数:[图像]用Matlab在图像上画矩形框

展开阅读全文

没有更多推荐了,返回首页