[PYTHON] Ich habe das Objekt gerade mit Image Repair (Inpaint) (OpenCV: C ++) gelöscht.

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_STEPFür große KratzerMULTI_STEPKombiniert mit kleinen Kratzern und großen KratzernITERATIVEEs 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

Ergänzung

mask.png

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 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

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

Ich habe das Objekt gerade mit Image Repair (Inpaint) (OpenCV: C ++) gelöscht.
Ich habe das Objekt gerade mit Image Repair (Inpaint) (OpenCV: Python) gelöscht.
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Ich habe versucht, Objekte mit Python und OpenCV zu erkennen
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
[Für Anfänger] Ich habe versucht, die Tensorflow-Objekterkennungs-API zu verwenden
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
Ich habe versucht, den auf Papier gestempelten Stempel mit OpenCV zu digitalisieren
Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten
[Python] Verwenden von OpenCV mit Python (Bildfilterung)
Beurteilung des hintergrundbeleuchteten Bildes mit OpenCV
[Python] Verwenden von OpenCV mit Python (Bildtransformation)
Ich habe versucht, GrabCut von OpenCV zu verwenden
Versuchen Sie, das Bild mit opencv2 zu verwischen
Ich habe versucht, die checkio-API zu verwenden
Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren
Ich habe versucht, die Trefferergebnisse von Hachinai mithilfe der Bildverarbeitung zu erhalten
Ich möchte ein Bild auf Jupyter Notebook mit OpenCV (Mac) anzeigen.