2017-01-23 7 views
0

Ich arbeite in OpenCV C++. Ich habe die classical lena image genommen und Gaussian Noise bestimmter Mittel und Varianz noised_lena angewendet. Ich habe dann ein durchschnittliches Filter auf dieses gerasterte Bild angewendet und ein unscharfes Bild Averaged Image erhalten.OpenCV - Keine erwünschte Ausgabe beim Anwenden des Laplace-Filters

Jetzt, wenn ich Laplace-Filter anwenden, muss es die Kanten not correct output korrekt erkennen. Aber ich bekomme nicht die gewünschte Ausgabe, wo das erwartete Bild sein sollte, man kann die Kanten sauber erkennen. Der Code ist unten angegeben.

Vielen Dank für die Hilfe im Voraus.

int main(int argc, char *argv[]) 
{ 
    int i, dim, k, l, j; 
    float res=0.0; 
    Mat M = imread(argv[1],0); //input image in M 
    Mat N(M.rows, M.cols, CV_8U);//Image obtained after applying average filter 
    Mat Lap_N(M.rows, M.cols, CV_8U);//Padding the N with zeros based on the filter size given by the user 
    Mat Lap(M.rows,M.cols,CV_8U);// image obtained after applying Laplacian filter 
    cout << "enter the size of the filter u want odd number only"<<endl; 
    cin >> dim; 
    Mat Pad_M((M.rows+((dim-1))), (M.cols+((dim-1))), CV_8U); 
    Mat Lap_M((M.rows+((dim-1))), (M.cols+((dim-1))), CV_8U); 
    copyMakeBorder(M, Pad_M,dim/2,dim/2,dim/2,dim/2, BORDER_CONSTANT, 0); 
    /*Average filter*/ 
    for(i=0;i<=Pad_M.rows-dim;i++) 
    { 
     for(j=0;j<=Pad_M.cols-dim;j++) 
     { res = 0.0; 
      for(k=0;k<dim;k++) 
      { 
       for(l=0;l<dim;l++) 
       { 
        res += Pad_M.at<uchar>(i+k,j+l); 
       } 
      } 
      res = res/(dim*dim); 
      N.at<uchar>(i, j)=(uchar)((int)(res)); 
     } 
    } 
/* Laplacian Filter*/ 
    copyMakeBorder(N, Lap_M,dim/2,dim/2,dim/2,dim/2, BORDER_CONSTANT, 0); 
    res = 0; 
    for(i=0;i<=Lap_M.rows-dim;i++) 
    { 
     for(j=0;j<=Lap_M.cols-dim;j++) 
     { 
      res = 0.0; 
      for(k=0;k<dim;k++) 
      { 
       for(l=0;l<dim;l++) 
       { 
        if(k==dim/2 && l==dim/2) 
        { 
         res =res - (((dim*dim)-1)*((float)Lap_M.at<uchar>(i+k,j+l))); 
        } 
        else 
        { 
         res += Lap_M.at<uchar>(i+k,j+l); 
        } 
       } 
      } 

      Lap_N.at<uchar>(i, j)=(uchar)((int)(res)); 
     } 
    } 

    imshow("original", M); 
    imshow("padded", Pad_M); 
    imshow("averaged", N); 
    imshow("Laplacian", Lap_N); 
    //imwrite("Lap2,500,5*5_lena.png",Lap); 
    waitKey(0); 
    return 0; 
} 
+0

Was bekommen Sie, was Sie nicht erwarten? – vu1p3n0x

+0

Ich denke, Sie brauchen möglicherweise die Normalisierung Schritt bei der Anwendung der Laplace-Filter: "res = res/(dim * dim);" – vu1p3n0x

Antwort

0

I durchgeführt Bild Normalisierung auf dem unscharfen Bild, das Sie zur Verfügung gestellt:

cv2.normalize(gray, alpha=5, beta=0, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)

Nachdem ich dieses Laplace-Filter konnte ich erhalten angewandt:

enter image description here

Hinweis: Stellen Sie zur Bildnormalisierung sicher, dass das Bild vom Typ float ist.

+0

respektiert Herr oder Frau Vielen Dank für Ihren wertvollen Vorschlag, ich fand den Fehler, der in meinem Code ist der Laplace-Teil, nach Zeile 21: i addierten die folgenden: if (res <0) \t \t \t {\t \t \t \t \t Lap_N.at (i, j) = 0; \t \t \t} \t \t \t else \t \t \t { \t \t \t \t Lap_N.at (i, j) = (uchar) (res); \t \t \t} und es hat funktioniert !!! –

+0

@ R.Anush eine Idee, was diese Linie tut? Bitte rufen Sie mich nicht Sir (Luke ist übrigens ein Name :)) –

+1

Entschuldigung, sehr spät zu antworten, und für das Anrufen Sie Herr, das Code-Schnipsel, das ich hinzufügte, bildet den Wert von res ab (das die Summe des Pixels hat Werte) auf 0, wenn es unter 0 fällt, und geben Sie es andernfalls in den UCHAR-Typ ein. –

Verwandte Themen