brapbboom
brapbboom

Reputation: 69

Removing image noise like dots and lines

I am new to OpenCV and Python and I have been encountering a problem in removing noises in my input image. I only wanted to extract the nucleus of a WBC so I used addition to highlight the nucleus and used thresholding to remove the RBCs in the image. I successfully removed the RBCs but the platelets are not removed and some lines appeared in the borders. I also tried using dilation, erosion, opening and closing to denoise the image but the nucleus gets destroyed.

Here is my code:

img = cv2.imread('1.bmp')
img_2 = cv2.imread('1.bmp')
input_img = cv2.addWeighted(img, 0.55, img_2, 0.6, 0)
retval, threshold = cv2.threshold(input_img, 158, 255, cv2.THRESH_BINARY)
threshold = cv2.cvtColor(threshold, cv2.COLOR_BGR2GRAY)
retval2, threshold2 = cv2.threshold(threshold, 0, 255, 
cv2.THRESH_BINARY+cv2.THRESH_OTSU)
blur2 = cv2.medianBlur(threshold2,5)

Here is the original image:

enter image description here

After Thresholding:

enter image description here

Upvotes: 2

Views: 860

Answers (1)

Suleiman
Suleiman

Reputation: 316

If the nucleus of a WBC as you have highlighted is always the largest contour before thresholding, I would suggest using findContours to store it alone and remove the smaller blobs like this:

 vector<vector<Point>>contours; //Vector for storing contour
    vector<Vec4i> hierarchy;

    //Find the contours in the image
    findContours(input_img, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE); 

    for (int i = 0; i< contours.size(); i++) // iterate through each contour. 
    {
        double a = contourArea(contours[i], false);  //  Find the area of contour
        if (a>largest_area){
            largest_area = a;

            //Store the index of largest contour
            largest_contour_index = i; 

               // Find the bounding rectangle for biggest contour            
            bounding_rect = boundingRect(contours[i]); 
        } 
    }
    Scalar color(255, 255, 255);

    // Draw the largest contour using the previously stored index.
    Mat dst;
    drawContours(dst, contours, largest_contour_index, color, CV_FILLED, 8, hierarchy); 

My code is C++ but you can find python examples: How to detect and draw contours using OpenCV in Python?

Upvotes: 1

Related Questions