Smorodov 579 Жалоба Опубликовано July 19, 2012 Заполнялка дырок, сделал по книжке Гонсалес, Вудс "Digital Image Processing". #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,; 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 & { 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 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано July 20, 2012 можно вроде и через внутренние контуры?(через opencv) найти их и залить. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах