如何统计一张黑色背景图像中的白色区域数量?

我是一名学习python的本科学生,在设计小组作业时遇到了一些问题,本组的作业是要记录一个培养皿内的菌落数量,目前代码如下

import cv2
import numpy as np
from PIL import Image
from glob import glob
import os

#二值化并获取图像内培养皿的圆形区域
original_img = cv2.imread(r'1.jpeg')
gray_img = cv2.cvtColor(original_img,cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray_img,0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)
contours, _ = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for cont in contours:
    (x, y), radius = cv2.minEnclosingCircle(cont)
    if radius>200:#掩膜
        ming=cv2.circle(original_img,(int(x),int(y)),int(radius-50), (0, 0, 255), 2)
        roi = np.zeros(original_img.shape[:2], np.uint8)
        roi = cv2.circle(roi,(int(x),int(y)), int(radius-50), 255, cv2.FILLED)
        mask = np.ones_like(original_img) * 255
        mask = cv2.bitwise_and(mask, original_img, mask=roi) + cv2.bitwise_and(mask, mask, mask=roi)

kernel1 = np.ones((5,5), np.uint8)
kernel2 = np.ones((3,3), np.uint8)#设置腐蚀和膨胀系数

gray_img = cv2.cvtColor(mask,cv2.COLOR_RGB2GRAY)
ret, th1 = cv2.threshold(gray_img, 150, 255, cv2.THRESH_BINARY)
erosion = cv2.erode(th1, kernel1, iterations=1)
dilation = cv2.dilate(erosion, kernel2, iterations=1)#腐蚀和膨胀去噪点
cv2.imshow('erosion', erosion)
cv2.imshow('dilation',dilation)
cv2.waitKey(0)

原图及经过以上操作获得的图像如下:

现在需要对图中的白点进行计数,连成片的按一个点计算,我的思路是通过遍历图中的像素,找到图像中的白色像素点,并寻找其周围的其他白色点直到找不到为止,则计数+1
但我感觉这种方法比较繁琐,请问有没有更好的解决方式?

阅读 3.8k
3 个回答

大概看了一下,将图片二值化,再使用cv2.connectedComponentsWithStats即可。

image.png

代码如下:

_, bin_img = cv2.threshold(dilation, 0, 1, cv2.THRESH_BINARY)

# 搜索图像中的连通区域
ret, labels, stats, centroid = cv2.connectedComponentsWithStats(bin_img, connectivity=4)

idx = 1
for stat in stats:
    if (stat[2] - stat[0]) > bin_img.shape[0] / 2:
        continue
    cv2.rectangle(original_img_cbk, (stat[0], stat[1]), (stat[0] + stat[2], stat[1] + stat[3]), (0, 0, 255), 2)
    cv2.putText(original_img_cbk, str(idx), (stat[0], stat[1] + 25), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 25, 25), 2)
    idx += 1

plt.imshow(original_img_cbk)
plt.show()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏