2014-06-12 16 views
9

Ist es möglich, nur einen Teilbereich eines Bildes zu verwischen, anstatt das gesamte Bild mit OpenCV, um einige Rechenkosten zu sparen?Gaußsche Unschärfe mit OpenCV: Verwischt nur einen Teilbereich eines Bildes?

Danke!

BEARBEITEN: Ein wichtiger Punkt ist, dass wenn die Grenze der Unterregion verwischt wird, sollte der vorhandene Bildinhalt so viel wie möglich verwendet werden; Nur wenn die Faltung die Grenze des Originalbildes überschreitet, kann eine Extrapolation oder andere künstliche Randbedingungen verwendet werden.

Antwort

10

das ganze Bild zu verwischen, vorausgesetzt, Sie die ursprüngliche (In-Place-Filterung von cv::GaussianBlur unterstützt wird) überschrieben werden soll, werden Sie so etwas wie

cv::GaussianBlur(image, image, Size(0, 0), 4); 

haben verschwimmen nur Region Verwendung Mat::operator()(const Rect& roi) die Region zu extrahieren:

cv::Rect region(x, y, w, h); 
cv::GaussianBlur(image(region), image(region), Size(0, 0), 4); 

Oder wenn Sie die unscharfe Ausgabe in einem separaten Bild wollen:

cv::Rect region(x, y, w, h); 
cv::Mat blurred_region; 
cv::GaussianBlur(image(region), blurred_region, Size(0, 0), 4); 
cv::Rect region(x, y, w, h); 
cv::Mat blurred_region; 
cv::GaussianBlur(image(region), blurred_region, Size(0, 0), 4); 

Das obige verwendet die Standardoption BORDER_CONSTANT Option, die nur davon ausgeht, alles außerhalb des Bildes ist 0, wenn die Unschärfe zu tun. Ich bin mir nicht sicher, was es mit Pixeln am Rand einer Region macht. Sie können erzwingen, dass Pixel außerhalb der Region ignoriert werden (BORDER_CONSTANT | BORDER_ISOLATE). SO denkt es, dass es wahrscheinlich die Pixel außerhalb der Region verwendet. Sie müssen die Ergebnisse von oben mit vergleichen:

const int bsize = 10; 
cv::Rect region(x, y, w, h); 
cv::Rect padded_region(x - bsize, y - bsize, w + 2 * bsize, h + 2 * bsize) 
cv::Mat blurred_padded_region; 
cv::GaussianBlur(image(padded_region), blurred_padded_region, Size(0, 0), 4); 

cv::Mat blurred_region = blurred_padded_region(cv::Rect(bsize, bsize, w, h)); 
// and you can then copy that back into the original image if you want: 
blurred_region.copyTo(image(region)); 
+0

Scheint, dass diese Methode nicht aufpasst von der Grenze - es benutzt immer noch eine Art von Interpolation anstelle dessen, was wirklich außerhalb der Region im Bild ist. Habe ich Recht damit? – xuhdev

+0

@xuhdev Sie haben Recht. Ich habe meiner Antwort ein Beispiel hinzugefügt, um dies zu umgehen. Wenn sich die Region in der Nähe von einem oder zwei Boardern des enthaltenen Bildes befindet, müssen Sie etwas Unordnung hinzufügen, um damit fertig zu werden. – Bull

+0

@xuhdev, nach dem Blick auf den Filter-Engine-Code, denke ich jetzt, dass Sie vielleicht nicht richtig sind. Müssen Sie testen. – Bull

3

Ja, es ist möglich, eine Region von Interesse in OpenCV zu verwischen.

size(120, 160); 
OpenCV opencv = new OpenCV(this); 
opencv.loadImage("myPicture.jpg"); 
opencv.ROI(60, 0, 60, 160); 
opencv.blur(OpenCV.BLUR, 13); 
image(opencv.image(), 0, 0); 

Weitere Informationen finden Sie in diesem link. Viel Glück,

+0

BTW, hatte die Frage ein C++ - Tag. Die C++ - Lösung hat eine ganz andere Form als Java. – Bull

+0

@B ... Für mich ist es egal. Es ist einfach, von einer Sprache in eine andere zu übersetzen. – xuhdev

+0

Hat es nicht einmal bemerkt, aber ich bin froh, dass ich helfen konnte –

Verwandte Themen