简体   繁体   中英

detecting countours of this image using opencv

I want to detect white blood cells (WBCs) and count them, so i had to make some steps and reached this image and don't know what to do next.

Original image:

原始图像

gray then closing morphology then thresholding:

灰色然后关闭形态然后阈值化

my code

import cv2
import numpy as np

# Read image
im = cv2.imread("images/image.jpg")
output = im.copy()
hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
gray_image = cv2.cvtColor(hsv, cv2.COLOR_BGR2GRAY)
blurG = cv2.GaussianBlur(gray_image, (9, 9), 0)
blurM = cv2.medianBlur(gray_image, 5)
cv2.imwrite("gray.jpg",gray_image)


res,thresh_img=cv2.threshold(blurM,135,255,cv2.THRESH_BINARY_INV)
kernel = np.ones((5,5),np.uint8) 
closing= cv2.morphologyEx(thresh_img,cv2.MORPH_CLOSE,kernel,iterations=2)
cv2.imwrite("result3.jpg",closing)

If the point is on a contour, it has neighbors with different values, and the gaussian blur with neigbors will be different.

So you just check for differences between "closing" image and his gaussian blur.

blurNeighbor = cv2.GaussianBlur(closing, (3, 3), 0)

#contour is any "closing" pixel different from "blurNeighbor"
contour=(blurNeighbor!=closing).astype(np.uint8)*255
cv2.imshow("Contour", contour)
cv2.waitKey(10)

轮廓

You can estimate the number of blobs by dividing the number of black pixels in "closing" by the median blob size.

For this image, it gives 33.5 blobs:

#detect blobs in "closing"
params = cv2.SimpleBlobDetector_Params()
params.filterByArea = False
params.filterByInertia = False
params.filterByConvexity = False

detector=cv2.SimpleBlobDetector_create(params)
blobs=detector.detect(closing)

#draw detected blobs
img_with_keypoints = cv2.drawKeypoints(closing, blobs, outImage=np.array([]), color=(0, 0, 255),flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow("Detected blobs", img_with_keypoints)
cv2.waitKey(10)

#estimate the number of blobs
blobAreas=np.sort([np.pi/4*b.size**2 for b in blobs])
medianArea=np.median(blobAreas)
blobCountEstimation=np.sum(closing==0)/medianArea

print(f"Estimated number of blobs: {blobCountEstimation:.1f}")
>>>Estimated number of blobs: 33.5

检测到的斑点

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM