- 图像显示窗口
# 函数自带方法
cv2.namedWindow('img', cv2.WINDOW_NORMAL) # 窗口大小可变
cv2.namedWindow('img', cv2.WINDOW_AUTOSIZE) # 窗口大小不可以改变
cv2.namedWindow('img', cv2.WINDOW_FREERATIO) # 窗口大小自适应比例
cv2.namedWindow('img', cv2.WINDOW_KEEPRATIO) # 保持比例
# 自定义显示窗口大小
def imshow(img,height,width,title):
cv2.namedWindow(title,0) # 标志 0 不可省
cv2.resizeWindow(title, width, height) # 自定义窗口大小
cv2.moveWindow(title,600,300) # 设置窗口在屏幕中位置
cv2.imshow(title,img)
cv2.waitKey(0)
- 滤波
cv2.blur() # 均值
cv2.guassian() # 高斯
cv2.median() # 中值
- 二值化
ret,dstimg = cv2.threshold(src, thresh, maxval, type[, dst])
- 边缘检测
cv2.canny(img,t1,t2) # img可以为彩色图,灰度图和二值图;一般t1,t2分别先取:50,100
cv2.Sobel()
cv2.Scharr()
# 对于opencv中没有的现成调用函数,但可以通过定义卷积核,利用cv2.filter2D函数实习边缘检测。
def cv_Edge(img,kernelX, kernelY):
# img: 原图像; kernelX、kernelY:X/Y方向的卷积核
# 计算梯度
x = cv2.filter2D(img, -1, kernelX) # 卷积运算
y = cv2.filter2D(img, -1, kernelY)
# 调用convertScaleAbs()函数计算绝对值
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
edgeImg= cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
return edgeImg
cv2.canny参数详细测试参考
# 为了方便找到合适的双阈值,可以利用滑动条,实时显示不同参数的检测效果
imgname = '60_standard.bmp'
img = cv2.imread(datapath+imgname)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
H,W = gray.shape
pW = 600
pH = int(pW * H / W)
ret, binary = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)
plt.figure()
plt.subplot(121)
plt.imshow(img,'gray')
plt.title('img')
plt.subplot(122)
plt.imshow(binary,'gray')
plt.title('binary')
plt.show()
def nothing(x): # 滑动条的回调函数
pass
WindowName = 'Clover'
cv2.namedWindow(WindowName, 0)
cv2.resizeWindow(WindowName, pW, pH)
cv2.createTrackbar('minValue', WindowName, 0, 200, nothing) # 创建滑动条
cv2.createTrackbar('maxValue', WindowName, 0, 250, nothing)
while (1):
minValue = cv2.getTrackbarPos('minValue', WindowName) # 获取滑动值
maxValue = cv2.getTrackbarPos('maxValue', WindowName)
canny = cv2.Canny(img,minValue,maxValue)
cv2.imshow(WindowName,canny)
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
- 形态学处理
cv2.dilate(img, kernel, iteration) #kernel: 卷积核,默认3*3;iterations: 迭代次数,默认1 需要根据需要增强的对象特征,自定义卷积核,矩形 方形 圆形 十字架等
imgname = '60_standard.bmp'
img = cv2.imread(datapath+imgname)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
H,W = gray.shape
pW = 600
pH = int(pW * H / W)
ret, binary = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)
canny = cv2.Canny(img,100,200)
kernel1 = np.ones(3,dtype=np.uint8)
kernel2 = np.array([[1,0,1],[0,1,0],[1,0,1]], np.uint8)
dilateimg1 = cv2.dilate(canny,kernel1,iterations=3)
dilateimg2 = cv2.dilate(canny,kernel2,iterations=3)
plt.figure()
plt.subplot(121)
plt.imshow(dilateimg1,'gray')
plt.title('dilateimg1')
plt.subplot(122)
plt.imshow(dilateimg2,'gray')
plt.title('dilateimg2')
plt.show()
两个边缘线角度在±45°左右,所以设计kernel2为3*3的正反对角线为1,对角线的增强效果好于kernel1.