7月份的上海,不是梅雨就是艳阳天,今天的气温又直逼35度去了,如此炎热的夏天,来一碗冰凉的绿豆汤,岂不美哉?
Step1 准备原料
我们需要的原料有:
- 绿豆:30g
- 冰糖:适量
- 清水:适量
绿豆30g,我突然发现家里竟然没有秤,本着工科生一如既往的严谨,绝不能随便抓一把就算了。
这有何难?于是经过小编查阅权威资料(百度),得到了一个绿豆的质量,大约为0.05g,那30/0.05=600,接下来,就是数出600颗绿豆就好了。
Step2 数绿豆
抓一把绿豆,撒在桌上:
一个工科生应有的倔强,手数是不可能用手数的,用什么数呢?让计算机帮我数呀!说干就干,Let's Go!
- 导入依赖库
import numpy as npimport cv2import matplotlib.pyplot as pltfrom skimage.morphology import watershedfrom skimage.feature import peak_local_maxfrom scipy import ndimageimport decimal
- 读取图像,显示图片
def read_img(img_path): ''' 读取图片 @param img_path: 图片路径 ''' return cv2.imread(img_path) def show(img): ''' 显示图片 @param img: cv2图片 ''' plt.imshow(img) plt.show()# 显示原始图片beans_img = read_img('.cachebeans.jpg')show(beans_img[:, :, :: -1]) # 显示RGB格式
- 处理图片
-
- 将图片转换由RGB为HSV格式:
beans_hsv = cv2.cvtColor(beans_img, cv2.COLOR_BGR2HSV)show(beans_hsv)
-
- 二值化,通过选定的阈值将图像转换为二值图像(0或255):
h, s, v = cv2.split(beans_hsv)_, thr = cv2.threshold(s, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)show(thr)
-
- 中值滤波,删除图像中不必要的斑点():
blur = cv2.medianBlur(thr, 5)show(blur)
- 数绿豆
-
- 通过轮廓检测和分水岭算法分别来数绿豆,并取均值来避免误差。
# 轮廓检测c, h = cv2.findContours(blur,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)beans_img2 = beans_img.copy()counts = []for i in c: area = cv2.contourArea(i) if area >200 : counts.append(i)# 分水岭算法beans_img3 = wolfberry_img.copy()D = ndimage.distance_transform_edt(thr)localMax = peak_local_max(D, indices=False, min_distance=40,labels=thr)markers = ndimage.label(localMax, structure=np.ones((3, 3)))[0]labels = watershed(-D, markers, mask=thr)ws = len(np.unique(labels)) -1# 计算均值ans = decimal.Decimal((len(counts) + ws)/2)print("print("number of lemon segments detected = ", ans)show(copy2)= ", ans)show(copy2)
print输出:绿豆数量 = 56
好了,用这个方法,循环几次,我们就能得到600颗绿豆。。。
Step3 煮汤
不要忘了,我们的目的是为了做一碗冰凉的绿豆汤~~
- 把绿豆放容器里
- 用水泡半小时
- 清洗干净过滤一下
- 锅里水烧开把绿豆倒进去
- 再次烧开后改中火慢慢熬,时不时的查看一下
- 30分钟后绿豆也差不多开花了,这时加入冰糖改小火再熬5分钟即可
- 想喝凉的就放冰箱冷藏一下
喝着这一碗冰凉的绿豆汤,这个夏天不再炎热了~~
参考阅读:
https://blog.csdn.net/hhhhhhhhhhwwwwwwwwww/article/details/106162289
https://www.toutiao.com/i6824878001772036620/