Jump to content
Compvision.ru
Sign in to follow this  
mrgloom

Склейка изображений и все что с этим связано.

Recommended Posts

пожалуй создам отдельную тему по сопоставлению изображений, чтобы объединить документы и темы с этим связанные и буду ее потихоньку наполнять.

перед ссылкой идет название статьи и в скобках авторы, чтобы можно было восстановить данные если что, в некоторых случаях еще и комментарии.

возможно надо изменить название темы и\или тэги.

Keywords: mosaicking,image stitching,point matching,SIFT,SURF,MSER,ASIFT,RANSAC,FAST,Harris corner detector,corner detector,Region descriptors,Region detectors.

Russian tags: склейка изображений, панорамные изображения.

Литература:

1.

Computational Methods for Automatic Image Registration (Marco Zuliani) - целый талмуд(докторская вроде).

http://vision.ece.ucsb.edu/publications/zuliani_thesis06.pdf

2.

A Mathematical Comparison of Point Detectors(M. Zuliani, C. Kenney and B. S. Manjunath)

http://vision.ece.ucsb.edu/publications/04IVRMarco.pdf

3.

A Condition Number for Point Matching with Application to Registration and Post-Registration Error Estimation

C. S. Kenney, B. S. Manjunath, M. Zuliani, G. Hewer, A. Van Nevel.

http://vision.ece.ucsb.edu/publications/03PamiRegistrationMarco.pdf

4.

An Axiomatic Approach to Corner Detection

C. S. Kenney M. Zuliani B. S. Manjunath

http://vision.ece.ucsb.edu/publications/05CVPRZuliani.pdf

5.

Automatic Panoramic Image Stitching using Invariant Features(Matthew Brown and David G. Lowe) -один из основных документов от создателя SIFT.

http://cvlab.epfl.ch/~brown/papers/ijcv2007.pdf

6.

Multi-Image Matching using Invariant Features(Matthew Alun Brown) - часть докторсокй

http://cvlab.epfl.ch/~brown/papers/phd.pdf

+30-40 еще будет

Рассматриваемые подтемы:

Region detectors-Region descriptors: (нахождение особых точек, выбор метода, детектора)

Методы детекторы: Harris-Laplace,Different-of-Gaussians, Laplace-of-Gaussians,

Теория:

1.

Scale & Affine Invariant Interest Point Detectors (KRYSTIAN MIKOLAJCZYK AND CORDELIA SCHMID) -рассмотрены несколько детекторов.

http://www.robots.ox.ac.uk/~vgg/research/affine/det_eval_files/mikolajczyk_ijcv2004.pdf

2.

Ближе к практике, исходникам, реализациям:

1.FAST Corner Detection -- Edward Rosten -FAST c исходниками.

http://mi.eng.cam.ac.uk/~er258/work/fast.html

2.бинарники Harris-Laplace,Different-of-Gaussians, Laplace-of-Gaussians ||+ Affine

http://lear.inrialpes.fr/people/dorko/downloads.html

3.Некоторое сравнение методов(affine invariant)

http://www.robots.ox.ac.uk/~vgg/research/affine/index.html

Point matching and filtering:(сопоставление и отсев точек)

--

Bundle Adjustment: (выравнивание изображений)

--

Image blending: (бесшовная склейка)

1.POISSON LOCAL COLOR CORRECTION FOR IMAGE STITCHING(Mohammad Amin Sadeghi, Seyyed Mohammad Mohsen Hejrati and Niloofar Gheissari)

2.A Multiresolution Spline With Application to Image Mosaics(PETER J. BURT and EDWARD H. ADELSON)

3.Eliminating Ghosting and Exposure Artifacts in Image Mosaics (Matthew Uyttendaele,Ashley Eden,Richard Szeliski)

Темы на форуме:

почти полный цикл для склейки изображений

http://www.compvision.ru/forum/index.php?showtopic=449

обсуждение вопроса выравнивания изображений после склейки

http://www.compvision.ru/forum/index.php?showtopic=517

выравнивание яркости, блендинг.

http://www.compvision.ru/forum/index.php?showtopic=508

http://www.compvision.ru/forum/index.php?showtopic=428

Обзоры на русском:

http://courses.graphicon.ru/files/courses/vision/2010/cv_2010_03.pdf

потом дополню и обобщу еще.

  • Like 2

Share this post


Link to post
Share on other sites

Блендинг при помощи Лаплассовых пирамид.

Сравнительные результаты блендинга разными методами:

http://www.cs.brown.edu/courses/csci1950-g/results/proj2/steveg/

Примеры на матлабе:

http://www.alecjacobson.com/weblog/?p=940

Исходник на opencv (источник):

#include "opencv2/opencv.hpp"

using namespace cv;

class LaplacianBlending {
private:
Mat_<Vec3f> left;
Mat_<Vec3f> right;
Mat_<float> blendMask;

vector<Mat_<Vec3f> > leftLapPyr,rightLapPyr,resultLapPyr;
Mat leftSmallestLevel, rightSmallestLevel, resultSmallestLevel;
vector<Mat_<Vec3f> > maskGaussianPyramid; //masks are 3-channels for easier multiplication with RGB

int levels;

void buildPyramids() {
buildLaplacianPyramid(left,leftLapPyr,leftSmallestLevel);
buildLaplacianPyramid(right,rightLapPyr,rightSmallestLevel);
buildGaussianPyramid();
}

void buildGaussianPyramid() {
assert(leftLapPyr.size()>0);

maskGaussianPyramid.clear();
Mat currentImg;
cvtColor(blendMask, currentImg, CV_GRAY2BGR);
maskGaussianPyramid.push_back(currentImg); //highest level

currentImg = blendMask;
for (int l=1; l<levels+1; l++) {
Mat _down;
if (leftLapPyr.size() > l) {
pyrDown(currentImg, _down, leftLapPyr[l].size());
} else {
pyrDown(currentImg, _down, leftSmallestLevel.size()); //smallest level
}

Mat down;
cvtColor(_down, down, CV_GRAY2BGR);
maskGaussianPyramid.push_back(down);
currentImg = _down;
}
}

void buildLaplacianPyramid(const Mat& img, vector<Mat_<Vec3f> >& lapPyr, Mat& smallestLevel) {
lapPyr.clear();
Mat currentImg = img;
for (int l=0; l<levels; l++) {
Mat down,up;
pyrDown(currentImg, down);
pyrUp(down, up, currentImg.size());
Mat lap = currentImg - up;
lapPyr.push_back(lap);
currentImg = down;
}
currentImg.copyTo(smallestLevel);
}

Mat_<Vec3f> reconstructImgFromLapPyramid() {
Mat currentImg = resultSmallestLevel;
for (int l=levels-1; l>=0; l--) {
Mat up;

pyrUp(currentImg, up, resultLapPyr[l].size());
currentImg = up + resultLapPyr[l];
}
return currentImg;
}

void blendLapPyrs() {
resultSmallestLevel = leftSmallestLevel.mul(maskGaussianPyramid.back()) +
rightSmallestLevel.mul(Scalar(1.0,1.0,1.0) - maskGaussianPyramid.back());
for (int l=0; l<levels; l++) {
Mat A = leftLapPyr[l].mul(maskGaussianPyramid[l]);
Mat antiMask = Scalar(1.0,1.0,1.0) - maskGaussianPyramid[l];
Mat B = rightLapPyr[l].mul(antiMask);
Mat_<Vec3f> blendedLevel = A + B;

resultLapPyr.push_back(blendedLevel);
}
}

public:
LaplacianBlending(const Mat_<Vec3f>& _left, const Mat_<Vec3f>& _right, const Mat_<float>& _blendMask, int _levels):
left(_left),right(_right),blendMask(_blendMask),levels(_levels)
{
assert(_left.size() == _right.size());
assert(_left.size() == _blendMask.size());
buildPyramids();
blendLapPyrs();
};

Mat_<Vec3f> blend() {
return reconstructImgFromLapPyramid();
}
};

Mat_<Vec3f> LaplacianBlend(const Mat_<Vec3f>& l, const Mat_<Vec3f>& r, const Mat_<float>& m) {
LaplacianBlending lb(l,r,m,4);
return lb.blend();
}[/code]

  • Like 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×