Перейти к содержимому
Compvision.ru
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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×