最近在做一个关于稻谷的检测计数的小软件,在制作的过程中对于图像的预处理环节看了许许多多的博客,看了许许多多的内容,于是,想把关于图像的预处理这一环节根据自己的实际需求进行一些介绍,其中也包括自己对于一些处理方法的自己理解和看法,希望大家可以一起共勉。
图像的预处理方式有许多种,灰度化或HSV、二值化、滤波,腐蚀膨胀,开运算,闭运算等等,那么就针对下图进行一个简单的预处理。
阈值二值化:阈值人为设置可能存在偏差,选择自适应阈值二值化方式:
由上图可知,我们拍摄的图片存在亮度不均匀的现象,第二张图片对于亮度的适应性较强,cv.THRESH_OTSU,阈值二值化方式较好,所以选择此种方式和此张照片进入下一步预处理。
滤波:有均值滤波、高斯滤波、中值滤波:
由上图可以发现中值滤波的效果较好。
之后对二值化图形进行参数提取,使用findCountours函数获取小麦的中点坐标以及最小矩形的长宽(这里代码表示水平方向的矩形,如果需要沿长轴方向的矩形,可以私聊),然后对小麦使用最小矩形进行框选,如下图所示:
可以看到图中部分区域识别不够清晰,需要进一步学习预处理操作。
这里得到右图之后可以对小麦进行计数,或者在countours元祖中对小麦参数进行提取操作,countours中有中心点坐标,最小矩形长宽比。
获得这些参数后可以对小麦进行分类操作、计数操作等等。
第一次写博客,记录一下!
欢迎咨询探讨。
import cv2 as cv
import numpy as np
image = cv.imread("C:/Users/rjx/Desktop/red.jpg")
image1 = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
h,w=image1.shape[:2]
m = np.reshape(image1,[1,w*h])
mean=m.sum()/(w*h)#图像中所有像素点的平均值
print('mean:',mean)
ret,i1 = cv.threshold(image1,mean,255,cv.THRESH_BINARY,0)#小于阈值置零,大于阈值置填充色
ret,i2 = cv.threshold(image1,mean,255,cv.THRESH_OTSU,1)#大于阈值置零,小于阈值置填充色
ret,i3 = cv.threshold(image1,mean,255,cv.THRESH_TOZERO,2)#小于阈值置零,大于阈值保持原色
ret,i4 = cv.threshold(image1,mean,255,cv.THRESH_TRUNC,3)#小于阈值保持原色,大于阈值置置灰色
cv.imshow("images_1", np.hstack([i1,i2,i3,i4]))
#简单的均值滤波,平均卷积操作
blur = cv.blur(i2,(3,3))
aussian = cv.GaussianBlur(i2,(5,5),1) #类似于正态分布,中间值权重最大,周围值权重依次递减
median = cv.medianBlur(i2,5) #中值滤波,除去杂波首选,可以很好地去除噪声
cv.imshow("images_3", np.hstack([blur,aussian,median]))
cv.imshow('median',median)
contours,hierarchy = cv.findContours(median, cv.RETR_TREE, cv.CHAIN_APPROX_TC89_KCOS) # 检测轮廓
print(type(contours)) #此处用来查看一下contours类型
for i, contour in enumerate(contours): #遍历contours元祖中的参数
x, y, w, h = cv.boundingRect(contour) #contour为轮廓中点坐标,以及长宽
cv.rectangle(image1, (x, y), (x + w, y + h), (0, 0, 0), 0) #检测计算矩形参数,第一个参数为轮廓识别图像,第二个参数为矩形左下点坐标,第三个参数为矩形,第四个参数为线颜色,第五个参数为线粗细
cv.drawContours(image, [contour], -1, 255, cv.FILLED) #将矩形绘制在image上
cv.imshow('image',image)
cv.waitKey(0)
cv.destroyAllWindows()