精华内容
下载资源
问答
  • 行业资料-交通装置-一种像素拼接式内饰车门.zip
  • 基于像素点特征的Harris角点检测拼接算法 matlab实现
  • OpenCV C#平台图片拼接

    2012-11-27 16:04:01
    EmguCV在VS2010平台下的图片拼接程序
  • 第二张图的X坐标明明是X偏移255的为什么中间有一像素呢? 此时如果你不加思索的就把X偏移改成254。仔细看看下面这个位置明显图片没有被拼接上?如果两张图片都是纯色的话可能这样可以被拼上,但是这是...

    如下图所示美术给我两张255X255的图片让我来拼接。第二张图的X坐标明明是X偏移255的为什么中间有一像素呢?




    此时如果你不加思索的就把X偏移改成254。仔细看看下面这个位置明显图片没有被拼接上?如果两张图片都是纯色的话可能这样可以被拼上,但是这是不解决核心问题的。。




    如果你看NGUI的源码你会发现NGUI会自动把奇数宽高的图片补起成偶数的宽高图片。如下图所示,当你制作完一个NGUI的图集后你会发现NGUI自动打开了MipMaps 并且利用三线性来过滤图片。




    如下图所示,如果你把混合模式改成点线性过滤,你会发现你的图片拼接的非常OK了。




    从效率上来说 点线性过滤 > 二线性过滤 > 三线性过滤。如果点线性过滤好用的话为什么NGUI要用三线性过滤呢?

    1.UISprite是可以随便缩放的,如果不缩放的话点线性没问题,可是一旦缩放因为用点像素来填充那么图片必然糙了。。

    2.我觉得NGUI是为了支持3D界面所以不得不在生成Atlas后时候勾上了Generate Mip Maps选择三线性来过滤图片。生成MipMaps以后那么在内存中的图片会大很多(MipMaps就是典型的用空间来换时间)所以如果你没有3D界面的话一定要把mipMaps关闭,采取二线性过滤即可。

    最后在回到文章的题目,如何解决NGUI图片的拼接问题。

    1.不要用奇数图片,保持美术给的图宽高都是偶数。

    2.拼接的时候都按偶数像素来拼接。

    3.取消Generate Mip Maps ,不生成MipMaps。

    4.图片采用点线性过滤模式。

    5.采取点线性过滤的话图集上的图片就不能使用NGU的缩放功能了,不然图片会糙的。我觉得可以把需要拼接的图片放在一个图集上,如果拼接的图片不多的话也可以考虑用UITexture 。

    这样问题就可以完美的解决。如下图所示,图片完美的拼接了。。。




    我对OpenGL 底层了解的也不多, 希望大家大家在留言处留下宝贵的意见。也算给我指点指点,谢谢。

    展开全文
  • 针对自动视觉检测系统中,难以获得具有重复纹理特征的大面积物体的高精度图像问题,提出了一种二维图像光栅的亚像素级定位拼接新方法。采用光栅尺记录物体的位置信息,引入圆盘格标定板对二维运动平台X、Y轴与相机X...
  • 图像拼接之MATLAB实现

    万次阅读 多人点赞 2017-05-18 11:09:46
    早期的图像拼接主要是运用像素值匹配的方法。后来,人们分别在两幅图像中寻找拐点、边缘等稳定的特征,用特征匹配的方法拼接图像。本实验根据Matthew Brown (2005) 描述的方法,实现多张生活照的拼接

    转自http://www.cnblogs.com/naive/p/3579610.html

    背景介绍

    图像拼接是一项应用广泛的图像处理技术。根据特征点的相互匹配,可以将多张小视角的图像拼接成为一张大视角的图像,在广角照片合成、卫星照片处理、医学图像处理等领域都有应用。早期的图像拼接主要是运用像素值匹配的方法。后来,人们分别在两幅图像中寻找拐点、边缘等稳定的特征,用特征匹配的方法拼接图像。本实验根据Matthew Brown (2005) 描述的方法,实现多张生活照的拼接。

     

    特征点捕捉 (Interest Point Detection)

    首先,拍摄两张场景有重合的照片。为了保证有足够多的公共特征点,照片的重合度应该保证在30%以上。将两张照片转换为灰度图像,对图像做σ=1的高斯模糊。在Matthew的文章中,他建立了一个图像金字塔,在不同尺度寻找Harris关键点。考虑到将要拼接的照片视野尺寸接近,故简化此步骤,仅在原图提取特征点。

    接下来用sobel算子计算图像在x、y两个方向亮度的梯度,用σ=1.5的高斯函数对梯度做平滑处理,减小噪点对亮度的影响。很容易发现,若我们求一小块区域内亮度的累加值,在图像变化平缓的区域上下左右移动窗口累加值的变化并不明显;在物体的边缘,沿着边缘方向的变化也不明显;而在关键点附近,轻微的移动窗口都会强烈改变亮度的累加值,如图1所示。

     

    图1 http://www.cse.psu.edu/~rcollins/CSE486/lecture06.pdf

    亮度的变化值可以用下面的公式计算得到:

            (1)

    其中,w(x, y) 是高斯函数的权重,I(x, y)是该点亮度的梯度。

    在计算时,上面的公式又可以近似为如下:

            (2)

    通过比较矩阵的特征值l1和l2,我们可以判断该点所处的状态。若l1>>l2或者l2<<l1,表示该点位于纵向或者横向的边缘;若l1和l2近似且值很小,表示该点位于平滑区域;若l1和l2近似但值很大,表示该点位于关键点。根据Harris and Stephens (1988) 的介绍,我们并不需要直接计算两个特征值,用R = Det(H)/Tr(H)2的值就可以反映两个特征值的比值,这样可以减少运算量。我们保留R > 2的点。除此之外,每个点的R和周围8邻域像素的R值比较,仅保留局部R值最大的点。最后,去除图片边界附近的关键点。

    至此,我们在两幅图片分别得到了一组关键点,如图2所示。

     

    图2 Harris Corner

     

    自适应非极大值抑制 (Adaptive Non-Maximal Suppression)

    由于上一步得到的关键点很多,直接计算会导致很大的运算量,也会增加误差。接下去就要去除其中绝大部分的关键点,仅保留一些特征明显点,且让关键点在整幅图像内分布均匀。Matthew发明了adaptive non-maximal suppression (ANMS) 方法来择优选取特定数量的关键点。

    ANMS的思想是有一个半径r,初始值为无限远。当r不断减小时,保留在半径r以内其它关键点R值均小于中心点R值的关键点,将其加入队列。队列内的关键点数达到预设值后停止搜索。

     

    Xi是上一步得到的关键点的2维坐标,G是所有关键点的集合,c=0.9。

    实际计算时,我们将上述过程相反。这里我设定每幅图像各提取500个关键点。首先找出整幅图片R值最大的关键点Rmax,加入队列,并且得到Rmax*0.9的值。遍历所有关键点,若该关键点xi的Ri> Rmax*0.9, 该点的半径设为无限远;若该关键点xi的Ri< Rmax*0.9,计算该点到离它最近的Rj>0.9R的点xi,记录两点间的距离ri。最后将所有r排序,找出r最大的500个点,如图3所示。

     

    图3 Harris corner after ANMS

     

    关键点的描述 (Feature Descriptor)

    关键点的描述方法有很多种,包括局部梯度描述、尺度不变特征变换 (SIFT、SUFT) 等等。因为生活照的旋转角度通常不超过15°,所以这里不考虑关键点的旋转不变性。

    对图像做适度的高斯模糊,以关键点为中心,取40x40像素的区域。将该区域降采样至8x8的大小,生成一个64维的向量。对向量做归一化处理。每个关键点都用一个64维的向量表示,于是每幅图像分别得到了一个500x64的特征矩阵。

     

    关键点的匹配

    首先,从两幅图片的500个特征点中筛选出配对的点。筛选的方法是先计算500个特征点两两之间的欧氏距离,按照距离由小到大排序。通常情况下选择距离最小的一对特征向量配对。Lowe(2004)认为,仅仅观察最小距离并不能有效筛选配对特征点,而用最小的距离和第二小的距离的比值可以很好的进行筛选。如图4所示, 使用距离的比值能够获得更高的true positive, 同时控制较低的false positive。我使用的阈值是r1/r2<0.5。经过筛选后的配对特征点 如图5所示

     

    图 4. 配对正确率和配对方法、阈值选择的关系

     

    图 5. 筛选后的配对特征点

    关键点的匹配使用Random Sample Consensus (RANSAC) 算法。以一幅图像为基准,每次从中随机选择8个点,在另一幅图像中找出配对的8个点。用8对点计算得到一个homography,将基准图中剩余的特征点按照homography变换投影到另一幅图像,统计配对点的个数。

    重复上述步骤2000次,得到准确配对最多的一个homography。至此,两幅图像的投影变换关系已经找到。

     

    新图像的合成

    在做图像投影前,要先新建一个空白画布。比较投影后两幅图像的2维坐标的上下左右边界,选取各个方向边界的最大值作为新图像的尺寸。同时,计算得到两幅图像的交叉区域。

    在两幅图像的交叉区域,按照cross dissolve的方法制作两块如图6所示的蒙版,3个通道的像素值再次区间内递减(递升)。

     

    效果展示

    下面展示几张照片拼接的效果图。

     

    图 7. 拼接完成的新图像

     

    图 8. 以左边照片为基准拼接

     

     

     

    附Matlab代码:

    function [output_image] = image_stitching(input_A, input_B)
    % -------------------------------------------------------------------------
    % 1. Load both images, convert to double and to grayscale.
    % 2. Detect feature points in both images.
    % 3. Extract fixed-size patches around every keypoint in both images, and
    % form descriptors simply by "flattening" the pixel values in each patch to
    % one-dimensional vectors.
    % 4. Compute distances between every descriptor in one image and every descriptor in the other image. 
    % 5. Select putative matches based on the matrix of pairwise descriptor
    % distances obtained above. 
    % 6. Run RANSAC to estimate (1) an affine transformation and (2) a
    % homography mapping one image onto the other. 
    % 7. Warp one image onto the other using the estimated transformation.
    % 8. Create a new image big enough to hold the panorama and composite the
    % two images into it. 
    % 
    % Input:
    % input_A - filename of warped image
    % input_B - filename of unwarped image
    % Output:
    % output_image - combined new image
    % 
    % Reference:
    % [1] C.G. Harris and M.J. Stephens, A combined corner and edge detector, 1988.
    % [2] Matthew Brown, Multi-Image Matching using Multi-Scale Oriented Patches.
    % 
    % zhyh8341@gmail.com
    
    % -------------------------------------------------------------------------
    
    % READ IMAGE, GET SIZE INFORMATION
    image_A = imread(input_A);
    image_B = imread(input_B);
    [height_wrap, width_wrap,~] = size(image_A);
    [height_unwrap, width_unwrap,~] = size(image_B);
    
    % CONVERT TO GRAY SCALE
    gray_A = im2double(rgb2gray(image_A));
    gray_B = im2double(rgb2gray(image_B));
    
    
    % FIND HARRIS CORNERS IN BOTH IMAGE
    [x_A, y_A, v_A] = harris(gray_A, 2, 0.0, 2);
    [x_B, y_B, v_B] = harris(gray_B, 2, 0.0, 2);
    
    % ADAPTIVE NON-MAXIMAL SUPPRESSION (ANMS)
    ncorners = 500;
    [x_A, y_A, ~] = ada_nonmax_suppression(x_A, y_A, v_A, ncorners);
    [x_B, y_B, ~] = ada_nonmax_suppression(x_B, y_B, v_B, ncorners);
    
    % EXTRACT FEATURE DESCRIPTORS
    sigma = 7;
    [des_A] = getFeatureDescriptor(gray_A, x_A, y_A, sigma);
    [des_B] = getFeatureDescriptor(gray_B, x_B, y_B, sigma);
    
    % IMPLEMENT FEATURE MATCHING
    dist = dist2(des_A,des_B);
    [ord_dist, index] = sort(dist, 2);
    % THE RATIO OF FIRST AND SECOND DISTANCE IS A BETTER CRETIA THAN DIRECTLY
    % USING THE DISTANCE. RATIO LESS THAN .5 GIVES AN ACCEPTABLE ERROR RATE.
    ratio = ord_dist(:,1)./ord_dist(:,2);
    threshold = 0.5;
    idx = ratio<threshold;
    
    x_A = x_A(idx);
    y_A = y_A(idx);
    x_B = x_B(index(idx,1));
    y_B = y_B(index(idx,1));
    npoints = length(x_A);
    
    
    % USE 4-POINT RANSAC TO COMPUTE A ROBUST HOMOGRAPHY ESTIMATE
    % KEEP THE FIRST IMAGE UNWARPED, WARP THE SECOND TO THE FIRST
    matcher_A = [y_A, x_A, ones(npoints,1)]'; %!!! previous x is y and y is x,
    matcher_B = [y_B, x_B, ones(npoints,1)]'; %!!! so switch x and y here.
    [hh, ~] = ransacfithomography(matcher_B, matcher_A, npoints, 10);
    
    % s = load('matcher.mat');
    % matcher_A = s.matcher(1:3,:);
    % matcher_B = s.matcher(4:6,:);
    % npoints = 60;
    % [hh, inliers] = ransacfithomography(matcher_B, matcher_A, npoints, 10);
    
    
    % USE INVERSE WARP METHOD
    % DETERMINE THE SIZE OF THE WHOLE IMAGE
    [newH, newW, newX, newY, xB, yB] = getNewSize(hh, height_wrap, width_wrap, height_unwrap, width_unwrap);
    
    [X,Y] = meshgrid(1:width_wrap,1:height_wrap);
    [XX,YY] = meshgrid(newX:newX+newW-1, newY:newY+newH-1);
    AA = ones(3,newH*newW);
    AA(1,:) = reshape(XX,1,newH*newW);
    AA(2,:) = reshape(YY,1,newH*newW);
    
    AA = hh*AA;
    XX = reshape(AA(1,:)./AA(3,:), newH, newW);
    YY = reshape(AA(2,:)./AA(3,:), newH, newW);
    
    % INTERPOLATION, WARP IMAGE A INTO NEW IMAGE
    newImage(:,:,1) = interp2(X, Y, double(image_A(:,:,1)), XX, YY);
    newImage(:,:,2) = interp2(X, Y, double(image_A(:,:,2)), XX, YY);
    newImage(:,:,3) = interp2(X, Y, double(image_A(:,:,3)), XX, YY);
    
    % BLEND IMAGE BY CROSS DISSOLVE
    [newImage] = blend(newImage, image_B, xB, yB);
    
    % DISPLAY IMAGE MOSIAC
    imshow(uint8(newImage));
    
    

    ------------------------------- other functions -------------------------

    function [xp, yp, value] = harris(input_image, sigma,thd, r)
    % Detect harris corner 
    % Input:
    % sigma - standard deviation of smoothing Gaussian
    % r - radius of region considered in non-maximal suppression
    % Output:
    % xp - x coordinates of harris corner points
    % yp - y coordinates of harris corner points
    % value - values of R at harris corner points
    
    % CONVERT RGB IMAGE TO GRAY-SCALE, AND BLUR WITH G1 KERNEL
    g1 = fspecial('gaussian', 7, 1);
    gray_image = imfilter(input_image, g1);
    
    % FILTER INPUT IMAGE WITH SOBEL KERNEL TO GET GRADIENT ON X AND Y
    % ORIENTATION RESPECTIVELY
    h = fspecial('sobel');
    Ix = imfilter(gray_image,h,'replicate','same');
    Iy = imfilter(gray_image,h','replicate','same');
    
    % GENERATE GAUSSIAN FILTER OF SIZE 6*SIGMA (± 3SIGMA) AND OF MINIMUM SIZE 1x1
    g = fspecial('gaussian',fix(6*sigma), sigma);
    
    Ix2 = imfilter(Ix.^2, g, 'same').*(sigma^2); 
    Iy2 = imfilter(Iy.^2, g, 'same').*(sigma^2);
    Ixy = imfilter(Ix.*Iy, g, 'same').*(sigma^2);
    
    % HARRIS CORNER MEASURE
    R = (Ix2.*Iy2 - Ixy.^2)./(Ix2 + Iy2 + eps); 
    % ANOTHER MEASUREMENT, USUALLY k IS BETWEEN 0.04 ~ 0.06
    % response = (Ix2.*Iy2 - Ixy.^2) - k*(Ix2 + Iy2).^2;
    
    % GET RID OF CORNERS WHICH IS CLOSE TO BORDER
    R([1:20, end-20:end], :) = 0;
    R(:,[1:20,end-20:end]) = 0;
    
    % SUPRESS NON-MAX 
    d = 2*r+1; 
    localmax = ordfilt2(R,d^2,true(d)); 
    R = R.*(and(R==localmax, R>thd));
    
    % RETURN X AND Y COORDINATES 
    [xp,yp,value] = find(R);
    
    function [newx, newy, newvalue] = ada_nonmax_suppression(xp, yp, value, n)
    % Adaptive non-maximun suppression 
    % For each Harris Corner point, the minimum suppression radius is the
    % minimum distance from that point to a different point with a higher 
    % corner strength. 
    % Input:
    % xp,yp - coordinates of harris corner points
    % value - strength of suppression
    % n - number of interesting points
    % Output:
    % newx, newy - new x and y coordinates after adaptive non-maximun suppression
    % value - strength of suppression after adaptive non-maximun suppression
    
    % ALLOCATE MEMORY
    % newx = zeros(n,1);
    % newy = zeros(n,1);
    % newvalue = zeros(n,1);
    
    if(length(xp) < n)
    newx = xp;
    newy = yp;
    newvalue = value;
    return;
    end
    
    radius = zeros(n,1);
    c = .9;
    maxvalue = max(value)*c;
    for i=1:length(xp)
    if(value(i)>maxvalue)
    radius(i) = 99999999;
    continue;
    else
    dist = (xp-xp(i)).^2 + (yp-yp(i)).^2;
    dist((value*c) < value(i)) = [];
    radius(i) = sqrt(min(dist));
    end
    end
    
    [~, index] = sort(radius,'descend');
    index = index(1:n);
    
    newx = xp(index);
    newy = yp(index);
    newvalue = value(index);
    
    function n2 = dist2(x, c)
    % DIST2	Calculates squared distance between two sets of points.
    % Adapted from Netlab neural network software:
    % http://www.ncrg.aston.ac.uk/netlab/index.php
    %
    %	Description
    %	D = DIST2(X, C) takes two matrices of vectors and calculates the
    %	squared Euclidean distance between them. Both matrices must be of
    %	the same column dimension. If X has M rows and N columns, and C has
    %	L rows and N columns, then the result has M rows and L columns. The
    %	I, Jth entry is the squared distance from the Ith row of X to the
    %	Jth row of C.
    %
    %
    %	Copyright (c) Ian T Nabney (1996-2001)
    
    [ndata, dimx] = size(x);
    [ncentres, dimc] = size(c);
    if dimx ~= dimc
    error('Data dimension does not match dimension of centres')
    end
    
    n2 = (ones(ncentres, 1) * sum((x.^2)', 1))' + ...
    ones(ndata, 1) * sum((c.^2)',1) - ...
    2.*(x*(c'));
    
    % Rounding errors occasionally cause negative entries in n2
    if any(any(n2<0))
    n2(n2<0) = 0;
    end
    
    function [descriptors] = getFeatureDescriptor(input_image, xp, yp, sigma)
    % Extract non-rotation invariant feature descriptors
    % Input:
    % input_image - input gray-scale image
    % xx - x coordinates of potential feature points
    % yy - y coordinates of potential feature points
    % output:
    % descriptors - array of descriptors
    
    % FIRST BLUR WITH GAUSSIAN KERNEL
    g = fspecial('gaussian', 5, sigma);
    blurred_image = imfilter(input_image, g, 'replicate','same');
    
    % THEN TAKE A 40x40 PIXEL WINDOW AND DOWNSAMPLE TO 8x8 PATCH
    npoints = length(xp);
    descriptors = zeros(npoints,64);
    
    for i = 1:npoints
    %pA = imresize( blurred_image(xp(i)-20:xp(i)+19, yp(i)-20:yp(i)+19), .2);
    patch = blurred_image(xp(i)-20:xp(i)+19, yp(i)-20:yp(i)+19);
    patch = imresize(patch, .2);
    descriptors(i,:) = reshape((patch - mean2(patch))./std2(patch), 1, 64); 
    end
    
    function [hh] = getHomographyMatrix(point_ref, point_src, npoints)
    % Use corresponding points in both images to recover the parameters of the transformation 
    % Input:
    % x_ref, x_src --- x coordinates of point correspondences
    % y_ref, y_src --- y coordinates of point correspondences
    % Output:
    % h --- matrix of transformation
    
    % NUMBER OF POINT CORRESPONDENCES
    x_ref = point_ref(1,:)';
    y_ref = point_ref(2,:)';
    x_src = point_src(1,:)';
    y_src = point_src(2,:)';
    
    % COEFFICIENTS ON THE RIGHT SIDE OF LINEAR EQUATIONS
    A = zeros(npoints*2,8);
    A(1:2:end,1:3) = [x_ref, y_ref, ones(npoints,1)];
    A(2:2:end,4:6) = [x_ref, y_ref, ones(npoints,1)];
    A(1:2:end,7:8) = [-x_ref.*x_src, -y_ref.*x_src];
    A(2:2:end,7:8) = [-x_ref.*y_src, -y_ref.*y_src];
    
    % COEFFICIENT ON THE LEFT SIDE OF LINEAR EQUATIONS
    B = [x_src, y_src];
    B = reshape(B',npoints*2,1);
    
    % SOLVE LINEAR EQUATIONS
    h = A\B;
    
    hh = [h(1),h(2),h(3);h(4),h(5),h(6);h(7),h(8),1];
    
    function [hh, inliers] = ransacfithomography(ref_P, dst_P, npoints, threshold);
    % 4-point RANSAC fitting
    % Input:
    % matcher_A - match points from image A, a matrix of 3xN, the third row is 1
    % matcher_B - match points from image B, a matrix of 3xN, the third row is 1
    % thd - distance threshold
    % npoints - number of samples
    % 
    % 1. Randomly select minimal subset of points
    % 2. Hypothesize a model
    % 3. Computer error function
    % 4. Select points consistent with model
    % 5. Repeat hypothesize-and-verify loop
    % 
    % Yihua Zhao 02-01-2014
    % zhyh8341@gmail.com
    
    ninlier = 0;
    fpoints = 8; %number of fitting points
    for i=1:2000
    rd = randi([1 npoints],1,fpoints);
    pR = ref_P(:,rd);
    pD = dst_P(:,rd);
    h = getHomographyMatrix(pR,pD,fpoints);
    rref_P = h*ref_P;
    rref_P(1,:) = rref_P(1,:)./rref_P(3,:);
    rref_P(2,:) = rref_P(2,:)./rref_P(3,:);
    error = (rref_P(1,:) - dst_P(1,:)).^2 + (rref_P(2,:) - dst_P(2,:)).^2;
    n = nnz(error<threshold);
    if(n >= npoints*.95)
    hh=h;
    inliers = find(error<threshold);
    pause();
    break;
    elseif(n>ninlier)
    ninlier = n;
    hh=h;
    inliers = find(error<threshold);
    end 
    end
    
    function [newH, newW, x1, y1, x2, y2] = getNewSize(transform, h2, w2, h1, w1)
    % Calculate the size of new mosaic
    % Input:
    % transform - homography matrix
    % h1 - height of the unwarped image
    % w1 - width of the unwarped image
    % h2 - height of the warped image
    % w2 - height of the warped image
    % Output:
    % newH - height of the new image
    % newW - width of the new image
    % x1 - x coordate of lefttop corner of new image
    % y1 - y coordate of lefttop corner of new image
    % x2 - x coordate of lefttop corner of unwarped image
    % y2 - y coordate of lefttop corner of unwarped image
    % 
    % Yihua Zhao 02-02-2014
    % zhyh8341@gmail.com
    %
    
    % CREATE MESH-GRID FOR THE WARPED IMAGE
    [X,Y] = meshgrid(1:w2,1:h2);
    AA = ones(3,h2*w2);
    AA(1,:) = reshape(X,1,h2*w2);
    AA(2,:) = reshape(Y,1,h2*w2);
    
    % DETERMINE THE FOUR CORNER OF NEW IMAGE
    newAA = transform\AA;
    new_left = fix(min([1,min(newAA(1,:)./newAA(3,:))]));
    new_right = fix(max([w1,max(newAA(1,:)./newAA(3,:))]));
    new_top = fix(min([1,min(newAA(2,:)./newAA(3,:))]));
    new_bottom = fix(max([h1,max(newAA(2,:)./newAA(3,:))]));
    
    newH = new_bottom - new_top + 1;
    newW = new_right - new_left + 1;
    x1 = new_left;
    y1 = new_top;
    x2 = 2 - new_left;
    y2 = 2 - new_top;
    
    
    function [newImage] = blend(warped_image, unwarped_image, x, y)
    % Blend two image by using cross dissolve
    % Input:
    % warped_image - original image
    % unwarped_image - the other image
    % x - x coordinate of the lefttop corner of unwarped image
    % y - y coordinate of the lefttop corner of unwarped image
    % Output:
    % newImage
    % 
    % Yihua Zhao 02-02-2014
    % zhyh8341@gmail.com
    %
    
    
    % MAKE MASKS FOR BOTH IMAGES 
    warped_image(isnan(warped_image))=0;
    maskA = (warped_image(:,:,1)>0 |warped_image(:,:,2)>0 | warped_image(:,:,3)>0);
    newImage = zeros(size(warped_image));
    newImage(y:y+size(unwarped_image,1)-1, x: x+size(unwarped_image,2)-1,:) = unwarped_image;
    mask = (newImage(:,:,1)>0 | newImage(:,:,2)>0 | newImage(:,:,3)>0);
    mask = and(maskA, mask);
    
    % GET THE OVERLAID REGION
    [~,col] = find(mask);
    left = min(col);
    right = max(col);
    mask = ones(size(mask));
    if( x<2)
    mask(:,left:right) = repmat(linspace(0,1,right-left+1),size(mask,1),1);
    else
    mask(:,left:right) = repmat(linspace(1,0,right-left+1),size(mask,1),1);
    end
    
    % BLEND EACH CHANNEL
    warped_image(:,:,1) = warped_image(:,:,1).*mask;
    warped_image(:,:,2) = warped_image(:,:,2).*mask;
    warped_image(:,:,3) = warped_image(:,:,3).*mask;
    
    % REVERSE THE ALPHA VALUE
    if( x<2)
    mask(:,left:right) = repmat(linspace(1,0,right-left+1),size(mask,1),1);
    else
    mask(:,left:right) = repmat(linspace(0,1,right-left+1),size(mask,1),1);
    end
    newImage(:,:,1) = newImage(:,:,1).*mask;
    newImage(:,:,2) = newImage(:,:,2).*mask;
    newImage(:,:,3) = newImage(:,:,3).*mask;
    
    newImage(:,:,1) = warped_image(:,:,1) + newImage(:,:,1);
    newImage(:,:,2) = warped_image(:,:,2) + newImage(:,:,2);
    newImage(:,:,3) = warped_image(:,:,3) + newImage(:,:,3);
    
    展开全文
  • 图像拼接算法的基本原理

    千次阅读 2017-11-16 15:42:27
    ...全景视频是一种利用360 度全景图象建立虚拟环境的新方法。...可以利用图象重叠部分对应像素的相似性, 通过采用一种行之有效的拼接算法, 使得到的图象无缝平滑。 来自研学论坛 Wa

    转自:http://blog.csdn.net/yuyin86/article/details/6690423


    全景视频是一种利用360 度全景图象建立虚拟环境的新方法。全景图象是通过将普通照相机拍照到的边界部分重叠的图象进行拼接而创建的。可以利用图象重叠部分对应像素的相似性, 通过采用一种行之有效的拼接算法, 使得到的图象无缝平滑。


    来自研学论坛 Walkfarer和SCQ的帖子:

    http://bbs.matwav.com/post/view?bid=6&id=371051&sty=3&age=0&tpg=1&ppg=1#371051


    图像拼接是计算机视觉中的重要分支,它是将两幅以上的具有部分重叠的图像进行无缝拼接从而得到较高分辨率或宽视角的图像。目前成形算法原理大致如下:
    1、频率域:(不甚清楚)
         利用"相位相关法"完成两幅图像的平移估计(只能精确到像素级)。
    2、空间域:
    (1)基于特征的方法:找出特征点,进行匹配。
    a.使用HARRIS角点,然后使用灰度相关加松弛匹配找到对应点,如果两幅图像重叠区域较大,且透视变形较小,可以考虑使用这种方法。

    b.通过特征点的梯度方向等信息,确定一组最佳的特征匹配,利用这一组数据给出两幅图像间变换矩阵的估计初值,再利用递归算法找到最终的精确变换关系。在拍摄图片的相机的旋转与缩放不是很大的情况下可以实现较好效果。
    (2)和基于光差的方法(方法精确但收敛慢)。应用最广泛的一类拼接算法是柱面与球面图像的拼接,经过球面与柱面变换后,问题就归结为确定每幅图像的平移量。 

    以上是我阅读了一些文章总结出来的,贻笑大方了。希望各位修正或添加之。

    *********csq************
    我来补充吧.
    1 频率域: 一般是用fourier的相位相关,可以估计出频移,旋转,缩放。
    频移没什么好讨论的,比较简单, 估计缩放和旋转一般是变到极坐标系去做,无数的paper讨论这个问题,前面讨论“怎样判断两幅图像有没有重叠”的帖子,我给了一篇paper,今年ieee tran ip的。 还不错。频率域的有人做sub-pixel. 这个我也说过, university of centrl florida 的那个什么faroon (名字记不清了), 写了一篇这样的,但好像只能处理频移的sub-pixel. 我还发email问过他有没有处理旋转的sub-pixel. 他没有回。 ft.
    2.空域: 
    1 。楼主遗漏了基于intensity的方法,不过确实用的不多了。
    2。 特征的方法:
    看来最多的是 point-rgistration. 不过还是有做用边缘啊那些其他特征去拼的人 。 
    下面我就介绍一下point发.
    Point-registration: 
    1.经典的harris point, 现在有不少修正版 ,因为harris 当时对参数的选择并没有给出很好的建议,所以参数选择比较烦,我以前就试过很多参数. 
    参考文献:A Mathematical Comparison of Point Detectors
    Evaluation of Interest Point Detectors
    找到特征点那就要去匹配拉。
    一般是先初步估计一下,剔出差太多的匹配对。 可以用intensity的各种方法,但是这就摆出一个问题: 光照。 很麻烦,两幅图的光照差很多的话,有可能根本弄不出来匹配的点,但你从图上明显可以看到很多对都是匹配的。这个等会讨论。
    2.然后进一步估计匹配,RANSAC用的最多,也有其他的方法, 像paper: MLESAC- A new robust estimator with application to estimating image geometry.
    估计出匹配对,然后就要算那个乱七八糟的矩阵。 又是很多方法可以来做。一般是各种优化算法像 LM之类的。
    3.算出矩阵,然后把一个变到另外一个的坐标系,就是融合的问题了。咋个无缝拼接是个问题。 Szeliski的方法用的多,paper我忘了,等会那篇review里面可以查到。

    没有考虑的问题:
    1. 假设是perfect 的各种关系,像频移,旋转,缩放,仿射,实际上并不那么简单,实际数码照的片子关系很复杂。
    2. 光照。刚才说了,大问题。在估计匹配点,矩阵,甚至最后融合都会引入不少麻烦。

    SIFT 方法好,可以解决一些问题,

    经典的一篇综述
    Image alignment and stitching- A tutorial

    http://hi.baidu.com/simonyuee/blog/item/24961f6dfaa543fa431694bd.html

    展开全文
  • ![图片说明]... 如图想把图片1和图片2拼接起来变成图片3应该怎么写代码 最简单的代码即可 比如image3 = def function(image1,image2) 主要是这个def function怎么写
  • from PIL import Image import matplotlib.pyplot as plt img1 = Image.open(".\\111.jpg") img2 = Image.open(".\\222.jpg") result = Image.new(img1.mode, (320 * 2, 568 )) result.paste(img1, box=(0, 0)) ...
    from PIL import Image
    import matplotlib.pyplot as plt
    
    
    img1 = Image.open(".\\111.jpg")
    img2 = Image.open(".\\222.jpg")
    result = Image.new(img1.mode, (320 * 2, 568 ))
    result.paste(img1, box=(0, 0))
    result.paste(img2, box=(320, 0))
    result.save(".111222.jpg")
    plt.imshow(result)
    plt.show()
    

    展开全文
  • 设置body的font-size:0%
  • https://blog.csdn.net/yuki_rain/article/details/61915571
  • % 由 Maxime Deforet 撰写,2012 年 4 月 5 日。 % 输入 : % - mozaic : “重叠图”数组% 示例:[[1,2];[2,3];[3,4];... % 结尾% % 输出 : % - A : 从拼贴拼接的图像% - Xmozaic : 瓷砖的 xy 位置
  • 实验结果及实际应用效果表明:采用该高精度实时拼接新方法的多线阵CCD相机的大幅面扫描仪,在1 200 DPI分辨率、AO幅面、2.54 cm/s扫描率下,能够实时拼接3个三线阵CCD相机的图像数据,拼接精度为+1/一1像素,能成功...
  • 将二值图像中的断开的点连接起来,形成闭合区域,连接部分为单像素连接;
  • Unity 图片拼接1像素接缝处理

    千次阅读 2018-01-25 17:28:58
    承接ARKit案例开发/宣传Demo开发/游戏开发 QQ:2118590660 ARKit入门到精通系列 (视频教程地址) http://edu.manew.com/user/98138​​​​​​​ 感觉比没改之前好多了 ...
  • 可通过改变代码中图片的输入路径,输入任意图片,并读取出图片上任意点的亚像素级坐标。 可通过改变代码中图片的输入路径,输入任意图片,并读取出图片上任意点的亚像素级坐标。
  • 该方法针对图像拼接结果的特点,先对待评价图像进行边缘提取,然后利用拼接前后图像的边缘轮廓信息,综合图像像素误差信息和结构信息,根据其均值和方差等统计信息与影响图像拼接质量的主要因素(拼接错位和亮度突变...
  • 利用获取的序列图像根据步进电机的步进角度完成内表面全景图像的粗级拼接, 即在拼接中首先对步进旋转角度θ和图像素距离P进行标定, 然后根据标定结果选取待配准的子图像区域, 在子图像区域中采用基于相位相关的图像...
  • 基于像素点特征的Harris角点检测图像拼接(matlab实现) piccolo,之前做的东西,简单整理下,不是做图像方向的,写的不好轻喷 主要原理参看Harris角点检测原理及实现和Harris角点检测算法优化 下面简单说下: ...
  • 以距离拼接缝的距离为变量,获得拼接缝两侧每一列像素的补偿值,从而达到使每一列像素差减小,从肉眼看来则是消除了拼接缝.matlab实现非常快速方便
  • 利用预先标定好的双目深度传感器,通过运动采集到具有一定重叠区域的两张深度图,深度图与左目图像的像素点一一对应,对左目图像进行特征提取并匹配,计算出单应性矩阵,进而对两幅深度图进行拼接,并结合单应性矩阵对深度...
  • C# 图像拼接.zip

    2020-11-27 16:11:09
    C# 图像拼接源码,两张图,水平方向拼接,垂直方向拼接,整张图拼接,截取部分图拼接拼接后的图像像素为实际两张图片截取的像素总和,所以不会失真,解决对于相机视野拍照不全,需要拍两次或者多次的,合并后的...
  • LCD拼接屏分辨率陷阱

    2021-01-20 06:09:40
    通常我们所指的分辨率是指液晶屏的物理分辨率,即画面显示的点数,是水平和垂直像素值,这个数值决定了液晶屏幕的清晰度。  目前LCD拼接屏产品的主流分辨率是1366×768和1920×1080两种,符合通常所讲的16:9的宽屏...
  • 提出了基于600 mm口径干涉仪的一维子孔径拼接测量方法,通过像素错位误差模拟分析结果,设计并研制了一维大行程气浮型精密扫描拼接平台,实现了对角线接近1 m的大口径激光玻璃的全口径光学均匀性拼接检测,并对该...
  • 最近有个需求需要实现2张图融合渐变过程显示(作业还没交,先发文记录下~~) 原图如下: 效果图如下(依次是渐变过程截图,整过过程图显示在一个JPanel中):
  • ERDAS裁剪Subset、拼接Mosic、融合Merge、修改指定像素的值。
  • 根据图像空间特性减小角点搜索范围,通过设定梯度阈值,对梯度超过阈值的像素点进行Harris角点检测;改进Harris角点响应函数和角点筛选阈值的设定方式,摆脱了角点检测对筛选经验值的依赖。在相似测度Normalized Cross ...
  • 某知名IT教育企业的RPG地图块拼接技术课程,使用了Unity和2D Toolkit,有项目包和2DToolkit包。教学视频3集。
  • 获取到经纬度范围后,我们需要计算出瓦片的范围。...假设z为需要拼接的图层的层数,设n=2的z次方,lon为经度,lat为维度,则经纬度、层级和瓦片的坐标x、y的关系为: TileX =(lon+180)÷360×n; T

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,454
精华内容 7,781
关键字:

像素拼接