2

I am working on a program to detect wrinkles in an image taken from a high resolution camera. Currently the project is in its starting phase. I have performed the following steps until now:

  1. Convert to grayscale and contrast the image.
  2. Remove noise using Gaussian Blur.
  3. Apply Adaptive threshold to detect wrinkles.
  4. Use dilation to enhance the size of the detected wrinkle and join disparate elements of a single wrinkle as much as possible.
  5. Remove noise by finding the contours and removing the ones with lesser areas.

Here is the code of the same :

package Wrinkle.Detection;

import java.util.ArrayList;
import java.util.List;

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class DetectWrinkle {

    private Mat sourceImage;
    private Mat destinationImage;
    private Mat thresh;

    public void detectUsingThresh(String filename) {
        sourceImage =  Highgui.imread(filename, Highgui.CV_LOAD_IMAGE_GRAYSCALE);

        //Contrast
        Mat contrast = new Mat(sourceImage.rows(), sourceImage.cols(), sourceImage.type());
        Imgproc.equalizeHist(sourceImage, contrast);
        Highgui.imwrite("wrinkle_contrast.jpg", contrast);

        //Remove Noise
        destinationImage = new Mat(contrast.rows(), contrast.cols(), contrast.type());
        Imgproc.GaussianBlur(contrast, destinationImage,new Size(31,31), 0);
        Highgui.imwrite("wrinkle_Blur.jpg", destinationImage);

        //Apply Adaptive threshold
        thresh = new Mat();
        Imgproc.adaptiveThreshold(destinationImage, thresh, 255, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY_INV, 99, 10);
        Highgui.imwrite("wrinkle_threshold.jpg", thresh);

        // dilation 
        Mat element1 = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new  Size(2*3+1, 2*6+1));
        Imgproc.dilate(thresh, thresh, element1);
        Highgui.imwrite("wrinkle_thresh_dilation.jpg", thresh);

        //Find contours
        List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); 
        Mat image32S = new Mat();
        Mat threshClone = thresh.clone();
        threshClone.convertTo(image32S, CvType.CV_32SC1);
        Imgproc.findContours(image32S, contours, new Mat(), Imgproc.RETR_FLOODFILL,Imgproc.CHAIN_APPROX_SIMPLE);

        //Find contours with smaller area and color them to black (removing furhter noise)
        Imgproc.cvtColor(thresh, thresh, Imgproc.COLOR_GRAY2BGR); 
        for (int c=0; c<contours.size(); c++) {
            double value = Imgproc.contourArea(contours.get(c));
            if(value<500){
                Imgproc.drawContours(thresh, contours, c, new Scalar(0, 0, 0), -1); 
            }
        }
        Highgui.imwrite("wrinkle_contour_fill.jpg", thresh);

    }

    public static void main(String[] args) {
        DetectWrinkle dw = new DetectWrinkle();
        System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
        String imagefile = "wrinkle_guo (1).bmp";
        dw.detectUsingThresh(imagefile);
    }
}

Question: As you can see from the result shown below in the images, a single wrinkle on the skin is getting broken down into separate small elements. Here, I am trying to connect those elements to show the complete wrinkle by using dilate. Once it is done, I am removing the noise by first detecting the contours, calculating the area of the contours and then removing the contours with area less than a particular value.

However, this is not giving me a proper result so I feel that there could be some better way of joining the broken wrinkle elements. Please help me solve this.

And please pardon me if there is anything wrong with the question as I really need a solution and I am a newbie here.

Following are the images :

Input image After getting contours and removing noise by finding contour area

Yoda
  • 323
  • 6
  • 14
edeesan
  • 326
  • 3
  • 16
  • the proper way to do this would be to take an image that shows the wrinkles with a better contrast. work on your illumination. it doesn't make much sense to take a crappy image and then do some image processing voodoo. first rule of image processing: crap in = crap out. and we all know we cannot make gold out of crap – Piglet Oct 20 '16 at 10:50
  • Did you find any solution for this??? – Mani Vasagam Dec 05 '18 at 11:44
  • you should try Hessian filter – Jeru Luke Apr 23 '22 at 16:20

0 Answers0