openCV提供了非常好用的简单全局阈值分割的函数
cv2.threshold(src, thresh, maxval, type, dst=None) 关于threshold函数详解
对原始灰度图像进行灰度直方图分析,可以明显看出灰度值分布区间较大,并且有三座峰(这里暂时不考虑多阈值分割问题),因此难以通过单一阈值进行有效分割,所以应使用 OTSU 或者 TRIANGLE 的优化方法。
但是如果直接对图像进行二值化处理,得到的效果可能不尽人意(Tips:在二值化之前需要转化为灰度图像,因要使用 OTSU 或者 THRESH 进行算法优化,两种优化策略详情见方法链接。而且该实验场景下灰度图像会大大简化实验操作)。
import cv2 as cv
#原始图像
img = cv.imread("rice.png")
#色彩空间转换
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, otsu = cv.threshold(gray_img, 0, 255,
cv.THRESH_BINARY | cv.THRESH_OTSU)
ret2, triangle = cv.threshold(gray_img, 0, 255,
cv.THRESH_BINARY | cv.THRESH_TRIANGLE)
cv.imshow("otsu", otsu)
cv.imshow("triangle", triangle)
cv.waitKey(0)
形态学操作其实就是改变物体的形状,比如腐蚀就是”变瘦”,膨胀就是”变胖”
在实验中我将使用开操作(先对图像进行腐蚀再对图像进行膨胀)通过这种方式来获取到理想的图像。
kernels = np.ones((5, 5), np.uint8)
# 腐蚀
img_erode = cv.erode(img, kernels, iterations=5)
cv.imshow("erode_image",img_erode)
# 膨胀
img_dilation = cv.dilate(img_erode, kernels, iterations=5)
cv.imshow("dilation_image", img_dilation)






而对于面积和周长的求取,opencv提供了 contourArea 和 arcLength 两种方法,非常容易得到。


图像处理只有多动手实验才能提升自己的理解,空想算法只是空中楼阁,我们每个人都是调参师!



