在学习了opencv的基础操作后,我们就可以在基础上稍微的进行一下拓展,进行一些较为进阶的操作。
目录
一,阈值图像:
二,图像处理:
1,均值滤波:
2,方框滤波:
3,高斯滤波:
4,中值滤波:
三,形态学:
1,腐蚀操作:(二值:比如黑白?)
2,膨胀操作 :(与腐蚀类似)
3,开运算:
4,闭运算:
5,梯度运算:
6,礼帽与黑帽:
一,阈值图像:
首先是关于图像的阈值操作:
cat = cv2.imread('cat.jpg')
#ret,dst = cv2.threshold(src,thresh,maxval,type)
# scr:输入图,只能输入单通道图像
# dst:输出图
# thresh:阈值 通常是127
# maxval:当像素超过了阈值(根据type),所赋的值
# type:二值化操作,五种类型:
#cv2.THRESH_BINARY 超过阈值取maxval,否则取0
#cv2.THRESH_BINARTY_INV cv.THRESH_BINARY的反转
#cv2.THRESH_TRUNC 大于阈值的部分设为阈值,否则不变
#cv2.THRESH_TOZERO 大于阈值的部分不改变,否则设为0
#cv2.THRESH_TOZERO_INV cv.THRESH_TOZERO 的反转
关于阈值的操作有五种基本的类型,操作方法也比较类似,我们用第一个举例:
ret,dst1 = cv2.threshold(cat,127,255,cv2.THRESH_BINARY)
cv_show('a',dst1)
第一张是原图,第二张是对原图进行操作后的图。
二,图像处理:
1,均值滤波:
均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度g(x,y),即g(x,y)=∑f(x,y)/m m为该模板中包含当前像素在内的像素总个数。
blur = cv2.blur(cat,(3,3))
cv_show('b',blur)
2,方框滤波:
与均值滤波相似,不同的是归一化。
#方框滤波:与均值相似(可选择归一化)
box1= cv2.boxFilter(cat,-1,(3,3),normalize=True) #和除以九
cv_show('c',box1)
#不用归一化,容易越界
box2= cv2.boxFilter(cat,-1,(3,3),normalize=False)
cv_show('d',box2)
第一张图归一化,与均值类似,第二张图没有归一化,就会很容易越界。
3,高斯滤波:
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
#高斯:离得近权重大,1表示权重(正态分布)
aussian = cv2.GaussianBlur(cat,(5,5),1)
cv_show('e',aussian)
4,中值滤波:
把矩阵中的数按大小排列,取中间的数作为矩阵的值。
#中值滤波:用中值代替
median = cv2.medianBlur(cat,5)
cv_show('f',median)
以上这些方法都是为了去除噪点,使图像更加清晰。
下面这行代码是为方便比较各个图像操作的不同点。
res = np.hstack((blur,aussian,median))
cv_show('j',res)
三,形态学:
1,腐蚀操作:(二值:比如黑白?)
kernel = np.ones((5,5),np.uint8) #(5,5)范围
erosion = cv2.erode(cat,kernel,iterations=1) #iterations:执行几次
cv_show('h',erosion)
这些分别是执行1,2,3次之后的结果。
2,膨胀操作 :(与腐蚀类似)
kernel = np.ones((5,5),np.uint8)
dilate =cv2.dilate(cat,kernel,iterations=1)
cv_show('j',dilate)
这些分别是执行1,2,3次之后的结果。
更改范围可以得到不同的结果,以执行一次为例:范围越小,越接近原图,范围越大,越接近执行多次后的图。
3,开运算:
先腐蚀后膨胀,可以去毛刺
#开:先腐蚀后膨胀(去毛刺?)
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(cat,cv2.MORPH_OPEN,kernel)
cv_show('i',opening)
4,闭运算:
先膨胀后腐蚀,可以补窟窿
#闭:先膨胀后腐蚀(补窟窿?)
kernel = np.ones((5,5),np.uint8)
closing = cv2.morphologyEx(cat,cv2.MORPH_CLOSE,kernel)
cv_show('i',closing)
左边为开运算,右边为闭运算。
5,梯度运算:
梯度=膨胀-腐蚀
kernel = np.ones((5,5),np.uint8)
dilate= cv2.dilate(cat,kernel,iterations=5)
cv_show('g',dilate)
6,礼帽与黑帽:
礼帽=原始-开运算:
#礼帽=原始-开运算
tophat = cv2.morphologyEx(cat,cv2.MORPH_TOPHAT,kernel)
cv_show('k',tophat)
黑帽=闭运算-原始
tophat = cv2.morphologyEx(cat,cv2.MORPH_TOPHAT,kernel)
cv_show('k',tophat)
第一张图为礼帽,第二张图为黑帽。
本次的学习就到这里,有什么错误的地方欢迎大家指正。
(注:为方便比较,引用了大量的图片)