2016-03-30 10 views
1

Ich versuche diesem Pseudocode zu folgen, um einen Wasserfarbfilter in Open CV zu implementieren. CV-Wasserfarbfilter öffnen. (durch die Pixel eines Bildes iterierend)

Ich habe früher den Effekt mit dieser Methode in Javascript mit einer Leinwand erreicht, weil ich über die Pixel iterieren konnte, aber ich bin mir nicht sicher, wie man das mit Open CV macht.

Mat im = imread(...); //input image 
Mat paint; // output after processing 
for(int i = 0; i < im.rows; i++) 
{ 
    for (int j = 0; j < im.cols; j++) //for each pixel 
    { 
     //here I need a reference to the pixel colour from im 
    } 
} 

Ich habe versucht, zu verwenden:

im.at<uchar>(i,j) 

Dies ist jedoch mich zum größten Teil Werte rund 350 geben, die mir vorgeschlagen, dass es die Kumulation der RGB-Kanäle ist (ein Multi-Channel-Array I denken). Also habe ich versucht, es so zu teilen:

Aber es gibt mir nur den gleichen Wert 3 mal. Irgendwelche Vorschläge?

Antwort

0

Ich landete sie nur Zugriff auf so:

int r = im.at<cv::Vec3b>(y,x)[0]; 
int g = im.at<cv::Vec3b>(y,x)[1]; 
int b = im.at<cv::Vec3b>(y,x)[2]; 

wie in der Antwort auf eine frühere Anfrage erwähnt wurde.

-1

In den meisten Fällen sind die Farben nur 8-Bit-kombiniert und nicht in einem Array, so dass Sie Masken benötigen, um sie zu manipulieren.

short red = (color >> 16) & 0xFF; 
short green = (color >> 8) & 0xFF; 
short blue = (color) & 0xFF; 

(via how to color mask in c)

+0

Vielen Dank für Ihre Antwort, tut mir leid, ich bin mir nicht sicher, ob ich wirklich verstehe. Was füttere ich in die Farbe Platzhalter/Variable? 'im.at (i, j)'? nach meinem Beispiel? Ich habe das ausprobiert und ich habe vernünftige Werte im blauen Kanal bekommen, aber nur 0 für rot und grün. Irgendwelche Ideen? –

+0

Wenn ich mich richtig erinnere, müssten Sie Ihre Farben mit Ihrem im.at (i, j) holen, was Ihnen einen 32-Bit (oder 24?) Pixel bringt. Dann müssen Sie das korrigierte Pixel in ein neues Matrixobjekt einfügen, das anschließend in Ihr Bild geschrieben wird. Die Tatsache, dass Ihr Pixel immer 350 ist, könnte jedoch ein anderes Problem sein. – Webster

+0

Also wenn ich den Wert als Vec3b speichern color = im.at (Punkt (j, i)); Ich bekomme einen Vektor 3 mit den roten blauen und grünen Kanälen, aber wie kann ich darauf zugreifen? Ich habe color.val [0] ausprobiert, um das Rot zu bekommen, aber das hat mir den ursprünglichen Wert von 300+ wieder gegeben. –

Verwandte Themen