Quantcast
Channel: OpenCV Q&A Forum - RSS feed
Viewing all articles
Browse latest Browse all 41027

isotropic non-linear diffusion smoothing (Perona-Malik)

$
0
0
Now in addition to the my [previous thread regarding isotropic linear diffusion smoothing](http://answers.opencv.org/question/70552/isotropic-linear-diffusion-smoothing/), I want to solve the non-linear version of it based on the Perona-Malik approach. Again we have the following formula: ![image description](/upfiles/14424136449965231.png)(1) , where `D` is not a constant but varies across the image domain. A popular choice is the Perona-Malik diffusivity which can be given as: ![image description](/upfiles/14424137293129764.png)(2) where `λ` is the contrast parameter. `∇u(x, y)` is the gradient of the image at pixel `(x, y)`. It seems that KAZE features embed this functionality, therefore I have a look at the [source code](https://github.com/pablofdezalc/kaze/tree/master/src/lib). Specifically the formula (2) is implemented with the [following function](https://github.com/pablofdezalc/kaze/blob/master/src/lib/nldiffusion_functions.cpp#L74): /* ************************************************************************* */ /** * @brief This function computes the Perona and Malik conductivity coefficient g2 * g2 = 1 / (1 + dL^2 / k^2) * @param Lx First order image derivative in X-direction (horizontal) * @param Ly First order image derivative in Y-direction (vertical) * @param dst Output image * @param k Contrast factor parameter */ void pm_g2(const cv::Mat &Lx, const cv::Mat& Ly, cv::Mat& dst, float k) { Size sz = Lx.size(); dst.create(sz, Lx.type()); float k2inv = 1.0f / (k * k); for(int y = 0; y < sz.height; y++) { const float *Lx_row = Lx.ptr(y); const float *Ly_row = Ly.ptr(y); float* dst_row = dst.ptr(y); for(int x = 0; x < sz.width; x++) { dst_row[x] = 1.0f / (1.0f + ((Lx_row[x] * Lx_row[x] + Ly_row[x] * Ly_row[x]) * k2inv)); } } } However, while I am trying to use it regarding to what @LBerger came up in the other thread I cannot get the correct output. What do I miss again? I see that the author apply some [scalar non-linear diffusion step functionality](https://github.com/pablofdezalc/kaze/blob/master/src/lib/KAZE.cpp#L162) which I do not really understand what it is about it, [here](https://github.com/pablofdezalc/kaze/blob/master/src/lib/nldiffusion_functions.cpp#L257) is the function. I tried what @Guanta suggested in the other thread > I think in the evolution_ - Vector> (KAZEFeatures.h) are the evolutions> over time, so if you'd take the last> element and then from that element's> struct (TEvolution.h) the Lsmooth Mat> should be the image which has been> smoothed. To create the> evolution_-vector you need to call> `Create_Nonlinear_Scale_Space()` . but it did not give a good output :-(.

Viewing all articles
Browse latest Browse all 41027

Trending Articles