Background Ich werde die Inpaint-Funktion einführen, die nur in C ++ vorhanden ist, und zwar nach Ich habe das Objekt mithilfe der Bildreparatur (Inpaint) (OpenCV: Python) gelöscht.
Introduction
Ich habe es grob in der Tabelle zusammengefasst.
inpaint type | year | python | include | library | thesis | note |
---|---|---|---|---|---|---|
Navier-Stokes) Methode | 2001 | ○ | #include <opencv2/photo.hpp> |
opencv_photo |
Navier-stokes, fluid dynamics, and image and video inpainting | Algorithmus basierend auf Fluiddynamik |
Methode von Alexandru Telea | 2004 | ○ | #include <opencv2/photo.hpp> |
opencv_photo |
An image inpainting technique based on the fast marching method. | Ein Algorithmus, der auf der Fast Marching-Methode basiert und Kratzer von der Grenze des Bereichs nach innen schrittweise repariert |
Patch-Offset-Methode | 2012 | × | #include <opencv2/xphoto.hpp> |
opencv_xphoto |
Statistics of Patch Offsets for Image Completion | Ein Algorithmus, der ähnliche Bilder in einem Bild ableitet und repariert |
Fuzzy-Fourier-Transformationsmethode | 2014 | × | #include <opencv2/fuzzy.hpp> |
opencv_fuzzy |
Image reconstruction by means of F-transform | Eine Methode mit Fourier-Transformation. Für kleine KratzerONE_STEP Für große KratzerMULTI_STEP Kombiniert mit kleinen Kratzern und großen KratzernITERATIVE Es werden 3 Muster vorbereitet |
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);
//Maskenbildhintergrund schwarz-Reparaturabschnitt weiß
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;
}
Lauf
make
./inpaint
Das Laden des Maskenbildes ist für jede Funktion unterschiedlich.
cv :: inpaint
macht den zu reparierenden Bereich weiß, aber cv :: xphoto :: inpaint`` cv :: ft :: inpaint
macht ihn schwarz. Daher wird es mit cv :: Mat mask_inv = ~ mask_img;
invertiert.
Result
library | parameter | image | odds |
---|---|---|---|
photo | INPAINT_NS | ||
photo | INPAINT_TELEA | ||
xphoto | INPAINT_SHIFTMAP | ||
fuzzy | ONE_STEP | × | |
fuzzy | MULTI_STEP | ◎ | |
fuzzy | ITERATIVE | ○ |
Wenn Sie die oben genannte Zeit löschen möchten, wird sie basierend auf dem Hintergrundbild repariert, sodass es kein Problem mit "cv :: inpaint" gibt. Was den Untertitel unten betrifft, wenn Sie "cv :: inpaint" verwenden, ist die Falte in der Mitte scharf, aber es scheint, dass "cv :: ft :: inpaint" etwas entspannt ist. Obwohl es verschwommen ist als andere Teile, ist MULTI_STEP
natürlich als Ganzes fertig.
cv :: xphoto :: inpaint INPAINT_SHIFTMAP
wird basierend auf dem Abschnitt im Bild eingefügt und scheint effektiv zu sein, wenn das Hintergrundbild viele identische Objekte wie Gebäude und Wälder enthält.
Sie können sehen, dass "cv :: ft :: inpaint ONE_STEP" nicht unterstützt wird, da es sich um einen Parameter für kleine Kratzer handelt.
Future Nächstes Mal werde ich versuchen, die Untertitel im Video zu löschen: smirk_cat:
Reference
Recommended Posts