Search code examples
matlabimage-processingnoise-reductionbinary-image

Remove noise in BW image


I used MATLAB to generate this image (using bwareaopen). In the middle I have a 2D ellipsoid. How can I clear all the "noise" surrounding of it and get a clear ellipsoid?

enter image description here

original image

enter image description here


Solution

  • Have a look at this solution. As mentioned in the comments I used DoG - Difference of Gaussians

    What does DoG mean ?

    First you have to take two separate Gaussians of an image with two separate kernels. (By Gaussian I mean apply ing gaussian blur). The difference of the two resultants is called the DoG.

    This is what I did:

    • Converted the given umage to gray scale:

    enter image description here

    • Then I applied bilateral filtering to preserve edges and smoothen non-edges:

    enter image description here

    (If you look intently you can see the difference).

    • Applied Gaussian blur to the above image:

    enter image description here

    • Now performed DoG with the above two images to obtain this: (I merely subtracted the two images above)

    enter image description here

    • Then I performed Morphological operation using the ellipse kernel to enhance the edge of the cell:

    enter image description here

    • To remove the unwanted speckles around the image I performed median filtering and finally obtained this:

    enter image description here

    You can refine this process to get an enhance image .

    EDIT:

    Here is the code I used:

    import cv2
    
    filename = 'Cell.jpg'
    img = cv2.imread(filename)
    cv2.imwrite('img.jpg',img)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    cv2.imwrite('gray.jpg',gray)
    
    bi = cv2.bilateralFilter(gray,7,75,75)
    cv2.imwrite('bi.jpg',bi)
    blur = cv2.GaussianBlur(bi,(3,3),0)
    cv2.imwrite('blur.jpg',blur)
    blur1 = cv2.GaussianBlur(bi,(17,17),0)
    dog = blur1 - bi
    cv2.imwrite('DoG.jpg',dog)
    
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
    close = cv2.morphologyEx(dog, cv2.MORPH_CLOSE, kernel, 13)
    cv2.imwrite('close.jpg',close)
    
    median = cv2.medianBlur(close,3)
    cv2.imwrite('median.jpg',median)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()