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 rayuresITERATIVE 3 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
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 | ||
photo | INPAINT_TELEA | ||
xphoto | INPAINT_SHIFTMAP | ||
fuzzy | ONE_STEP | × | |
fuzzy | MULTI_STEP | ◎ | |
fuzzy | ITERATIVE | ○ |
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