Je viens d'effacer l'objet en utilisant la réparation d'image (inpaint) (OpenCV: C ++)

Background Je vais présenter la fonction inpaint qui n'existe qu'en C ++, après J'ai effacé l'objet en utilisant la réparation d'image (inpaint) (OpenCV: Python).

Introduction

Je l'ai résumé grossièrement dans le tableau.

inpaint type year python include library thesis note
Navier-Stokes) méthode 2001 #include <opencv2/photo.hpp> opencv_photo Navier-stokes, fluid dynamics, and image and video inpainting Algorithme basé sur la dynamique des fluides
Méthode par Alexandru Telea 2004 #include <opencv2/photo.hpp> opencv_photo An image inpainting technique based on the fast marching method. Un algorithme basé sur la méthode Fast Marching qui répare progressivement les rayures de la limite de la zone vers l'intérieur
Méthode de décalage de patch 2012 × #include <opencv2/xphoto.hpp> opencv_xphoto Statistics of Patch Offsets for Image Completion Un algorithme qui déduit et répare des images similaires dans une image
Méthode de transformation de Fourier floue 2014 × #include <opencv2/fuzzy.hpp> opencv_fuzzy Image reconstruction by means of F-transform Une méthode utilisant la transformée de Fourier. Pour les petites rayuresONE_STEP, Pour les grosses rayuresMULTI_STEP, Combiné avec de petites rayures et de grandes rayuresITERATIVE3 modèles sont préparés

Development

GNUmakefile


CXX = c++
CXXFLAGS =  -I/usr/local/Cellar/opencv/4.1.1_2/include/opencv4/
LDFLAGS = -L/usr/local/Cellar/opencv/4.1.1_2/lib/
LDLIBS =  -lopencv_core -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -lopencv_fuzzy -lopencv_photo -lopencv_xphoto
CXXVERSION = -std=c++11

inpaint: inpaint.cpp
	$(CXX) $< -o $@ $(CXXFLAGS) $(CXXVERSION) $(LDFLAGS) $(LDLIBS)

clean :
	rm inpaint

inpaint.cpp


#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/fuzzy.hpp>
#include <opencv2/photo.hpp>
#include <opencv2/xphoto.hpp>


int main(int argc, const char* argv[]) {
	cv::Mat src = cv::imread("./capture_2.png ");


	cv::Mat resizeMat, dst, mergeMat;
	cv::resize(src, resizeMat, cv::Size(), 0.5, 0.5);

	//Fond d'image de masque noir-Section de réparation blanc
	cv::Mat mask_img = cv::Mat::zeros(resizeMat.size(), CV_8UC3);
	cv::rectangle(mask_img, cv::Point(185,255), cv::Point(470,300), cv::Scalar(255,255,255), -1, cv::LINE_AA); 
	cv::rectangle(mask_img, cv::Point(40,25), cv::Point(115,65), cv::Scalar(255,255,255), -1, cv::LINE_AA);
	cv::rectangle(mask_img, cv::Point(200,40), cv::Point(440,110), cv::Scalar(255,255,255), -1, cv::LINE_AA);

	cv::cvtColor(mask_img,mask_img,cv::COLOR_BGR2GRAY);

	cv::imwrite("mask.png ", mask_img);

	// ns
	cv::inpaint(resizeMat, mask_img, dst, 3, cv::INPAINT_NS);
	cv::imwrite("output_ns.png ", dst);
	dst.release();

	// telea
	cv::inpaint(resizeMat, mask_img, dst, 3, cv::INPAINT_TELEA);
	cv::imwrite("output_telea.png ", dst);
	dst.release();

	cv::Mat mask_inv = ~mask_img;
	resizeMat.copyTo(mergeMat, mask_inv);

	// xphoto
	cv::xphoto::inpaint(mergeMat, mask_inv, dst, cv::xphoto::INPAINT_SHIFTMAP);
	cv::imwrite("output_xphoto_shiftmap.png ", dst);
	dst.release();

	// fuzzy
	cv::ft::inpaint(mergeMat, mask_inv, dst, 3, cv::ft::LINEAR, cv::ft::ONE_STEP);
	cv::imwrite("output_fuzzy_linear_one_step.png ", dst);
	dst.release();

	cv::ft::inpaint(mergeMat, mask_inv, dst, 3, cv::ft::LINEAR, cv::ft::MULTI_STEP);
	cv::imwrite("output_fuzzy_linear_multi.png ", dst);
	dst.release();

	cv::ft::inpaint(mergeMat, mask_inv, dst, 3, cv::ft::LINEAR, cv::ft::ITERATIVE);
	cv::imwrite("output_fuzzy_linear_iterative.png ", dst);
	dst.release();

	src.release();
	mergeMat.release();
	resizeMat.release();
	mask_img.release();
	mask_inv.release();

   return 0;
}

Courir


make
./inpaint

Supplément

mask.png

La façon de charger l'image de masque est différente pour chaque fonction. cv :: inpaint rend la zone à réparer blanche, mais cv :: xphoto :: inpaint`` cv :: ft :: inpaint la rend noire. Par conséquent, il est inversé avec cv :: Mat mask_inv = ~ mask_img;.

Result

library parameter image odds
photo INPAINT_NS output_ns.png
photo INPAINT_TELEA output_telea.png
xphoto INPAINT_SHIFTMAP output_xphoto_shiftmap.png
fuzzy ONE_STEP output_fuzzy_linear_one_step.png ×
fuzzy MULTI_STEP output_fuzzy_linear_multi.png
fuzzy ITERATIVE output_fuzzy_linear_iterative.png

Si vous voulez effacer le temps ci-dessus, il sera réparé en fonction de l'image d'arrière-plan, il n'y a donc aucun problème avec cv :: inpaint. Quant au sous-titre ci-dessous, si vous utilisez cv :: inpaint, le pli sera net au milieu, mais cv :: ft :: inpaint semble être un peu détendu. Bien qu'il soit flou que d'autres parties, MULTI_STEP est fini naturellement dans son ensemble.

cv :: xphoto :: inpaint INPAINT_SHIFTMAP est collé en fonction de la section de l'image, et il semble être efficace lorsqu'il y a de nombreux objets identiques tels que des bâtiments et des forêts dans l'image d'arrière-plan.

Vous pouvez voir que cv :: ft :: inpaint ONE_STEP n'est pas supporté car c'est un paramètre pour les petites rayures.

Future La prochaine fois, j'essaierai d'effacer les sous-titres de la vidéo: smirk_cat:

Reference

Recommended Posts

Je viens d'effacer l'objet en utilisant la réparation d'image (inpaint) (OpenCV: C ++)
Je viens d'effacer l'objet en utilisant la réparation d'image (inpaint) (OpenCV: Python)
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé de "différencier" l'image avec Python + OpenCV
J'ai essayé la détection d'objets en utilisant Python et OpenCV
J'ai essayé de "binariser" l'image avec Python + OpenCV
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
[Pour les débutants] J'ai essayé d'utiliser l'API Tensorflow Object Detection
J'ai essayé de traiter l'image en "style croquis" avec OpenCV
J'ai essayé de numériser le tampon estampé sur papier en utilisant OpenCV
J'ai essayé de traiter l'image dans un "style de dessin au crayon" avec OpenCV
[Python] Utilisation d'OpenCV avec Python (filtrage d'image)
Jugement de l'image rétroéclairée avec OpenCV
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
J'ai essayé d'utiliser GrabCut d'OpenCV
Essayez de brouiller l'image avec opencv2
J'ai essayé d'utiliser l'API checkio
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
Je souhaite afficher une image sur Jupyter Notebook à l'aide d'OpenCV (mac)