# encoding: utf -8
import cv2 as cv
import copy
filename = 'rice.png'
img = cv.imread(filename)
# 灰度处理, 即使是黑白图片在计算机中也是三通道
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 使用大津算法阈值化
_, bw = cv.threshold(gray, 0, 0xff, cv.THRESH_OTSU)
element = cv.getStructuringElement(cv.MORPH_CROSS, (3, 3))
# 使用数学形态学开运算减少噪声
bw = cv.morphologyEx(bw, cv.MORPH_OPEN, element)
# 为了对阈值化图像进行分割,将阈值化结果进行deepcopy
seg = copy.deepcopy(bw)
# 使用findContours得到分割完之后各个区域对应的轮廓,返回在cnts,也就是各个轮廓的集合
bin, cnts, hier = cv.findContours(seg, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
count = 0
for i in range(len(cnts), 0, -1):
# 对所有轮廓进行一个循环,先得到当前轮廓,面积小于10则可能是噪声,丢弃
c = cnts[i-1]
area = cv.contourArea(c)
if area < 10:
continue
count = count + 1
print('blob', i, ':', area)
# 得到矩阵四个顶点
x, y, w, h = cv.boundingRect(c)
# 在img图片中输出分割后的矩形,rectangle函数参数依次为原图,左上角顶点pt,右下角顶点pt,颜色三元组,宽度
cv.rectangle(img, (x, y), (x+w, y+h), (0, 0, 0xff), 1)
# 在img图片中输出计数文本
cv.putText(img, str(count), (x, y), cv.FONT_HERSHEY_PLAIN, 0.5, (0, 0xff, 0))
print('米粒数量: ', count)
cv.imshow('原图', img)
cv.imshow('阈值化', bw)
cv.waitKey()
cv.destroyWindow()