Перейти к содержимому
Compvision.ru
Smorodov

Морфологическая заполнялка дырок

Recommended Posts

Заполнялка дырок, сделал по книжке Гонсалес, Вудс "Digital Image Processing".

post-1-0-81665300-1342730272_thumb.png


#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdarg.h>
#include "opencv2/core/core.hpp"
#include "opencv2/core/gpumat.hpp"
#include "opencv2/core/opengl_interop.hpp"
#include "opencv2/gpu/gpu.hpp"
#include "opencv2/ml/ml.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/nonfree/nonfree.hpp"
#include "fstream"
#include "iostream"
using namespace std;
using namespace cv;
//-----------------------------------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------------------------------
Mat MorphologicalReconstructionByDilation(Mat& F,Mat& B,Mat G)
{
Mat D,D_prev,test;
int summ=INT_MAX;
F.copyTo(D);
for(int i=0;summ!=0;i++)
{
dilate(D,D,B);
D=D&G;
if(!D_prev.empty())
{
test=D^D_prev;
summ=sum(test)[0];
}
D_prev=D.clone();
}
return D;
}
//-----------------------------------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------------------------------
Mat FillHoles(Mat& I,Mat &B)
{
I=(I>0); // Переведем все к 1 и 0
Mat I_C=1-I;
Mat F=Mat::zeros(I.rows,I.cols,CV_8UC1);
// Здесь должна быть инверсия точек границы исходного изображения,
// но для простоты нарисуем белую прямоугольную рамку.
// Предполагая, что граничные пиксели равны 0.
rectangle(F,Point(1,1),Point(I.cols-2,I.rows-2),Scalar::all(1));
Mat tmp1;
tmp1=MorphologicalReconstructionByDilation(F,B,I_C);
tmp1=1-tmp1;
tmp1=tmp1|I;
return tmp1;
}
//-----------------------------------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------------------------------

//-----------------------------------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------------------------------
int main( int argc, char** argv )
{
namedWindow("Src");
namedWindow("Res");

Mat BW=imread("C:\\ImagesForTest\\BWHoles.bmp",0);

int dilation_size=1;
Mat element1 = getStructuringElement( MORPH_RECT, Size( 2*dilation_size + 1, 2*dilation_size+1 ), Point( dilation_size, dilation_size ));

Mat res=FillHoles(BW,element1);

BW*=255;
res*=255;
imshow("Res",BW);
waitKey(0);

imshow("Res",res);
waitKey(0);

return 0;
}
[/code]

FillHoles.cpp

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


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

можно вроде и через внутренние контуры?(через opencv)

найти их и залить.

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×