在上一节过滤颜色之后我们发现,还有很多小颗粒或者漏洞存在。现在我们来学习怎么解决这个问题。
这一节我们用到了几个新的函数,比较简单就直接上代码了:
import cv2
import numpy as np
img = cv2.imread('HSV.jpg')
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
lower_red1 = np.array([160,50,0])
upper_red1 = np.array([179,255,255])
lower_red2 = np.array([0,50,0])
upper_red2 = np.array([10,255,255])
mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
mask = mask1 + mask2
res = cv2.bitwise_and(img,img, mask = mask)
cv2.imshow('img',img)
cv2.imshow('mask',mask)
#cv2.imshow('res',res)
'''
#OPEN and CLOSE
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
cv2.imshow('Opening',opening)
cv2.imshow('Closing',closing)
#erosion and dilation
kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(mask,kernel,iterations = 1)
dilation = cv2.dilate(mask,kernel,iterations = 1)
cv2.imshow('Erosion',erosion)
cv2.imshow('Dilation',dilation)
'''
'''
blur = cv2.GaussianBlur(res,(15,15),0)
cv2.imshow('Gaussian Blurring',blur)
kernel = np.ones((15,15),np.float32)/225
smoothed = cv2.filter2D(res,-1,kernel)
cv2.imshow('Averaging',smoothed)
median = cv2.medianBlur(res,15)
cv2.imshow('Median Blur',median)
bilateral = cv2.bilateralFilter(res,15,75,75)
cv2.imshow('bilateral Blur',bilateral)
'''
cv2.waitKey(0)
cv2.destroyAllWindows()
总共两个大注释:
第一个:
#OPEN and CLOSE 开放和关闭
#erosion and dilation 腐蚀和膨胀
这两个放在一起说是因为,开放和关闭是由腐蚀和膨胀转化而来。
开放是先腐蚀再膨胀,关闭则反过来。
可以对自己的图像进行这样的操作。
这里放上一篇看起来比较生动的介绍
图是直接拿过来的,懒得点也可以直接看下面的图。
腐蚀:
膨胀:
第二个:属于平滑(模糊)的操作处理
平滑主要是为了消除噪音和伪影,opencv提供了5种不同的平滑操作:
cv2.filter2D()是简单平滑,用的并不多。
cv2.GaussianBlur()是使用高斯滤波器的平滑处理,这一种平滑处理算是比较常用的。
cv2.medianBlur()是中值滤波器。
cv2.bilateralFilter()是双边滤波器。
比较常用的由高斯滤波器和双边滤波器,高斯滤波器牺牲了边缘,这对边缘分析有很大的不好影响。而双边平滑可以认为是高斯平滑的进化版,中间加入了基于色彩强度差的高斯权重,所以比较好的保护了边缘。