如图所示(只要是米粒图都行),通过图像处理完成数米粒个数的功能,要求数米粒个数要正确。
- 图像预处理:将彩色图像转换为灰度图像,并对灰度图像进行平滑处理,以减少噪音的影响。
- 二值化处理:根据图像的灰度分布,选择适当的阈值将图像二值化,并对二值化图像进行形态学操作,以去除噪音并改善物体的形状。
- 目标检测和计数:使用轮廓查找功能,找到二值化图像中的所有轮廓,并对每个轮廓进行筛选,排除不符合米粒形状特征的轮廓。最后,统计剩余的轮廓数量,即为米粒的个数。
代码如下:
import cv2
# 读取图像并转换为灰度图像
image = cv2.imread('rice.jpg')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 对灰度图像进行平滑处理
blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)
# 二值化处理
_, thresholded_image = cv2.threshold(blurred_image, 100, 255, cv2.THRESH_BINARY)
# 形态学操作
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
morphology_image = cv2.morphologyEx(thresholded_image, cv2.MORPH_OPEN, kernel)
# 轮廓查找
contours, _ = cv2.findContours(morphology_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 统计米粒个数
rice_count = 0
for contour in contours:
area = cv2.contourArea(contour)
if area > 100 and area < 5000: # 根据实际情况调整面积阈值
rice_count += 1
print("米粒个数:", rice_count)
# 在图像上绘制轮廓(可要可不要)
contour_image = cv2.drawContours(image.copy(), contours, -1, (0, 255, 0), 2)
cv2.imshow("Contour Image", contour_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果没有cv2包,要在虚拟环境下下载,下载命令:
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/;
运行结果:
统计出的米粒个数为49,与实际相符合。