数字图像处理——作业4

Modified: 2013/04/01 15:57 by admin - Uncategorized
作业内容:根据靶点变换对tiger图像进行变换

100*100 靶点图像:
原图靶点图像:原图靶点      目标图像靶点图像:目标靶点

原图靶点坐标:(y,x)
(9,9), (9,19), (9,29), (9,39), (9,49), (9,59), (9,69), (9,79), (9,89), (19,9), (19,19), (19,29), (19,39), (19,49), (19,59), (19,69), (19,79), (19,89), (29,9), (29,19), (29,29), (29,39), (29,49), (29,59), (29,69), (29,79), (29,89), (39,9), (39,19), (39,29), (39,39), (39,49), (39,59), (39,69), (39,79), (39,89), (49,9), (49,19), (49,29), (49,39), (49,49), (49,59), (49,69), (49,79), (49,89), (59,9), (59,19), (59,29), (59,39), (59,49), (59,59), (59,69), (59,79), (59,89), (69,9), (69,19), (69,29), (69,39), (69,49), (69,59), (69,69), (69,79), (69,89), (79,9), (79,19), (79,29), (79,39), (79,49), (79,59), (79,69), (79,79), (79,89), (89,9), (89,19), (89,29), (89,39), (89,49), (89,59), (89,69), (89,79), (89,89)
目标靶点对应坐标:(y,x)
(7,7), (16,5), (26,3), (38,2), (50,1), (62,2), (73,3), (84,4), (93,6), (5,16), (14,14), (25,13), (37,11), (50,11), (63,11), (75,12), (86,14), (95,16), (3,27), (12,25), (23,23), (36,22), (50,22), (63,22), (76,23), (88,25), (97,26), (2,38), (11,37), (22,36), (35,35), (50,34), (64,35), (77,36), (89,37), (98,38), (1,50), (11,50), (22,50), (35,50), (50,50), (65,50), (78,50), (89,50), (99,50), (2,62), (11,63), (22,63), (35,64), (50,65), (64,64), (78,64), (89,63), (98,62), (3,73), (12,75), (23,76), (36,77), (50,78), (63,77), (76,76), (88,75), (97,74), (5,84), (14,86), (24,87), (37,89), (50,89), (63,89), (75,88), (86,86), (96,84), (7,94), (16,96), (26,97), (38,98), (50,99), (62,98), (74,97), (84,96), (94,94)

代码:
function imgtransform()
img = imread('tiger.jpg');
% 转化为灰度图像
g = zeros(300,300);
for x=1:300
    for y=1:300
        % 对每一个像素的RGB分量分别乘以系数0.2989,0.5870,0.1140再相加
        g(x,y) = img(x,y,1) * 0.2989 + img(x,y,2) * 0.5870 + img(x,y,3) * 0.1140;
    end
end
g = uint8(g);
img = g;

% 显示源图像
figure;
imshow(img);

% 源靶点坐标
ori=[9,9;9,19;9,29;9,39;9,49;9,59;9,69;9,79;9,89;19,9;19,19;19,29;19,39;19,49;19,59;19,69;19,79;19,89;29,9;29,19;29,29;29,39;29,49;29,59;29,69;29,79;29,89;39,9;39,19;39,29;39,39;39,49;39,59;39,69;39,79;39,89;49,9;49,19;49,29;49,39;49,49;49,59;49,69;49,79;49,89;59,9;59,19;59,29;59,39;59,49;59,59;59,69;59,79;59,89;69,9;69,19;69,29;69,39;69,49;69,59;69,69;69,79;69,89;79,9;79,19;79,29;79,39;79,49;79,59;79,69;79,79;79,89;89,9;89,19;89,29;89,39;89,49;89,59;89,69;89,79;89,89];
% 目标靶点坐标
map=[7,7;16,5;26,3;38,2;50,1;62,2;73,3;84,4;93,6;5,16;14,14;25,13;37,11;50,11;63,11;75,12;86,14;95,16;3,27;12,25;23,23;36,22;50,22;63,22;76,23;88,25;97,26;2,38;11,37;22,36;35,35;50,34;64,35;77,36;89,37;98,38;1,50;11,50;22,50;35,50;50,50;65,50;78,50;89,50;99,50;2,62;11,63;22,63;35,64;50,65;64,64;78,64;89,63;98,62;3,73;12,75;23,76;36,77;50,78;63,77;76,76;88,75;97,74;5,84;14,86;24,87;37,89;50,89;63,89;75,88;86,86;96,84;7,94;16,96;26,97;38,98;50,99;62,98;74,97;84,96;94,94];

% 进行变换
transformed = uint8(zeros(300,300));
for x=1:300;
    for y=1:300
        % 排除边界,并映射到 100*100
        xn = ((x-1)./299).*80 + 9;
        yn = ((y-1)./299).*80 + 9;
        % 找到四角靶点
        x1 = floor((xn+1)/10)*10-1;
        y1 = floor((yn+1)/10)*10-1;
        x2 = x1 + 10;
        y2 = y1 + 10;
        % 找到目标靶点
        p1 = findMapPosition(x1,y1,ori,map);
        p2 = findMapPosition(x1,y2,ori,map);
        p3 = findMapPosition(x2,y1,ori,map);
        p4 = findMapPosition(x2,y2,ori,map);

        % 求解x变换系数
        [ax,bx,cx,dx] = calcBiLinear(p1(1),p2(1),p3(1),p4(1), x1,x2,y1,y2);
        % 求解y变换系数
        [ay,by,cy,dy] = calcBiLinear(p1(2),p2(2),p3(2),p4(2), x1,x2,y1,y2);
        % 求解变换后坐标
        xx = ax.*xn + bx.*yn + cx.*xn.*yn + dx;
        yy = ay.*xn + by.*yn + cy.*xn.*yn + dy;

        % 最近邻差值
        xx = round((xx-1).*3)+1;
        yy = round((yy-1).*3)+1;

        % 边界截断
        if(xx>300) xx=300; end;
        if(yy>300) yy=300; end;
        if(xx<1) xx=1; end
        if(yy<1) yy=1; end

        transformed(x,y) = img(xx,yy);
    end
end

% 显示变换后的图像
figure; 
imshow(transformed);

% 主函数结束
end

% 寻找靶点子函数
function p = findMapPosition(x,y,ori,map)
    p = zeros(1,2);
    for i=1:size(ori,1)
        if( ori(i,1)==x && ori(i,2)==y )
            p(2) = map(i,1);
            p(1) = map(i,2);
            break;
        end
    end
end

% 双线性差值
function [a,b,c,d] = calcBiLinear(p1,p2,p3,p4, x1,x2,y1,y2)
c = (p1-p2-p3+p4)./(x1-x2)./(y1-y2);
a = ((p1+p2-p3-p4) - c.*(x1-x2).*(y1+y2))./2./(x1-x2);
b = ((p1+p3-p2-p4) - c.*(x1+x2).*(y1-y2))./2./(y1-y2);
d = p1 - a.*x1 - b.*y1 - c.*x1.*y1;
end

The end