Image Sharpening Using Laplacian Filter

后端 未结 4 1113
天涯浪人
天涯浪人 2020-12-14 11:57

I was trying to sharpening on some standard image from Gonzalez books. Below are some code that I have tried but it doesn\'t get closer to the results of the sharpened image

4条回答
  •  粉色の甜心
    2020-12-14 12:37

    I think the problem is that you are blurring the image before take the 2nd derivate.

    Here is the working code with the C++ API (I'm using Opencv 2.4.3). I tried also with MATLAB and the result is the same.

    #include 
    #include 
    #include 
    
    #include 
    
    using namespace cv;
    using namespace std;
    
    
    int main(int /*argc*/, char** /*argv*/) {
    
        Mat img, imgLaplacian, imgResult;
    
        //------------------------------------------------------------------------------------------- test, first of all
        // now do it by hand
        img = (Mat_(4,4) << 0,1,2,3,4,5,6,7,8,9,0,11,12,13,14,15); 
    
        // first, the good result
        Laplacian(img, imgLaplacian, CV_8UC1);
        cout << "let opencv do it" << endl;
        cout << imgLaplacian << endl;
    
        Mat kernel = (Mat_(3,3) << 
            0,  1, 0,
            1, -4, 1,
            0,  1, 0); 
        int window_size = 3;
    
        // now, reaaallly by hand
        // note that, for avoiding padding, the result image will be smaller than the original one.
        Mat frame, frame32;
        Rect roi;
        imgLaplacian = Mat::zeros(img.size(), CV_32F);
        for(int y=0; y(y,x) = v;
            }
        }
        imgLaplacian.convertTo(imgLaplacian, CV_8U);
        cout << "dudee" << imgLaplacian << endl;
    
        // a little bit less "by hand"..
        // using cv::filter2D
        filter2D(img, imgLaplacian, -1, kernel);
        cout << imgLaplacian << endl;
    
    
        //------------------------------------------------------------------------------------------- real stuffs now
        img = imread("moon.jpg", 0); // load grayscale image
    
        // ok, now try different kernel
        kernel = (Mat_(3,3) << 
            1,  1, 1,
            1, -8, 1,
            1,  1, 1); // another approximation of second derivate, more stronger
    
        // do the laplacian filtering as it is
        // well, we need to convert everything in something more deeper then CV_8U
        // because the kernel has some negative values, 
        // and we can expect in general to have a Laplacian image with negative values
        // BUT a 8bits unsigned int (the one we are working with) can contain values from 0 to 255
        // so the possible negative number will be truncated
        filter2D(img, imgLaplacian, CV_32F, kernel);
        img.convertTo(img, CV_32F);
        imgResult = img - imgLaplacian;
    
        // convert back to 8bits gray scale
        imgResult.convertTo(imgResult, CV_8U);
        imgLaplacian.convertTo(imgLaplacian, CV_8U);
    
        namedWindow("laplacian", CV_WINDOW_AUTOSIZE);
        imshow( "laplacian", imgLaplacian );
    
        namedWindow("result", CV_WINDOW_AUTOSIZE);
        imshow( "result", imgResult );
    
        while( true ) {
            char c = (char)waitKey(10);
            if( c == 27 ) { break; }
        }
    
        return 0;
    }
    

    Have fun!

提交回复
热议问题