2012-04-03 15 views
1

Ich benutze die C++ openCV API, und ich möchte nur bestimmte Pixel in einem Bild selektiv verwischen. Was ist der beste Weg, dies zu tun? Ich habe versucht, es über Submatrizen zu tun, aber ich konnte es nicht zur Arbeit bringen.OpenCV Filter Teil eines Bildes

//5 is the 'radius' i'm blurring (~1/2 kernel width) 
cv::Rect srcRect; 
srcRect.x = x - 5; 
srcRect.y = y - 5; 
srcRect.width = 2*5 + 1; 
srcRect.height = 2*5 + 1; 

cv::Rect dstRect; 
dstRect.x = x; 
dstRect.y = y; 
dstRect.width = 1; 
dstRect.height = 1; 

cv::Mat src = srcImage(srcRect); 
cv::Mat dst = dstImage(dstRect); 

cv::blur(src, dst, cv::Size(5,5)); 

Mit dem obigen Code ändert sich nichts.

Wenn ich beide Rechtecke auf srcRect einstelle, sind die Unterbilder verschwommen, aber die gesamte dst ist dann verschwommen, anstatt nur das einzelne Pixel.

Irgendwelche Ideen?

Antwort

3

src und dst müssen die gleiche Größe haben. In Ihrem Beispiel ist dst eine Unterregion von genau einem Pixel.

Ihr Code ist korrekt, abgesehen davon, wie Sie Rechtecke erstellen.

Rect srcDstRect(7, 7, 100, 100); 
cv::Mat src = srcImage(srcDstRect); 
cv::Mat dst = dstImage(srcDstRect); 

cv::blur(src, dst, cv::Size(5,5)); 
+0

Es scheint, dass cv :: Unschärfe _all_ Pixel in src verwischt. Ich möchte im Grunde ein einzelnes Pixel ändern und seinen Wert auf den Durchschnitt aller Werte festlegen. Irgendwelche Ideen? –

+0

Ich denke, Sie müssen Ihre eigene Unschärfe implementieren, weil OpenCV eine integrierte Interpolationsmethode hat. Oder machen Sie dst ein separates Bild, so groß wie src, behalten Sie src, wie Sie es definiert haben, und kopieren Sie die Mitte der dstImage – Sam

+1

Eigentlich in Ihrem Code, erstellt cv :: blur eine neue dst-Matrix, die eine verworfen Sie setzen, weil es nicht die gleiche Größe wie src hat. Alles, was Sie tun müssen, ist, das zentrale Pixel wieder in dstImage zu kopieren. – Sam

0

Der Eingang ist das Originalbild und Unschärfe ist der Klon Bild des Eingangs

int x1=1,y1=1,x2=200,y2=200; 

Rect region(x1, y1, x2, y2); 

GaussianBlur(input(region), blur(region), Size(5, 5), x,0); 
Verwandte Themen