一、滤波算法
img=cv2.imread("./image/four.jpg")
img=cv2.resize(img,(0,0),fx=0.6,fy=0.6)
cv2.imshow("init",img)
cv2.waitKey(0)
#均值滤波
blur=cv2.blur(img,(5,5)) #核是奇数
cv2.imshow("blur",blur)
cv2.waitKey(0)
#方框滤波
box=cv2.boxFilter(img,-1,(5,5),normalize=True) #归一化
cv2.imshow("box0",blur)
cv2.waitKey(0)
box=cv2.boxFilter(img,-1,(5,5),normalize=False) #超过255就为255
cv2.imshow("box1",blur)
cv2.waitKey(0)
#高斯滤波 位置不同、权值不同,距离中心节点越近权值越大,符合正态分布
gaussian=cv2.GaussianBlur(img,(5,5),0.1)
cv2.imshow("gaussian",blur)
cv2.waitKey(0)
#中值滤波
mediane=cv2.medianBlur(img,5)
cv2.imshow("mediane",blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
二、腐蚀与膨胀
简单地说,腐蚀就是黑的把白的吃掉,膨胀就是白的把黑色的吃掉
img=imread("./image/test.png")
img=cv2.resize(img,(0,0),fx=0.6,fy=0.6)
#腐蚀 erode
kernel=np.ones((3,3),np.uint8)
imgErode=cv2.erode(img,kernel,iterations=3)
#膨胀 delita
imgDilate=cv2.dilate(img,kernel,iterations=3)
cv2.imshow("init",img)
cv2.waitKey(0)
cv2.imshow("erode",imgErode)
cv2.waitKey(0)
cv2.imshow("dilate",imgDilate)
cv2.waitKey(0)
cv2.destroyAllWindows()
三、开运算与闭运算
img=cv2.imread("./image/test.png")
img=cv2.resize(img,(0,0),fx=0.6,fy=0.6)
kernel=np.ones((3,3),np.uint8)
#开运算 先腐蚀再膨胀
imgOpen=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
#闭运算,先膨胀再腐蚀
imgClose=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
cv2.imshow("init",img)
cv2.waitKey(0)
cv2.imshow("open",imgOpen)
cv2.waitKey(0)
cv2.imshow("close",imgClose)
cv2.waitKey(0)
cv2.destroyAllWindows()
四、梯度运算
显示一下大致的轮廓,就是膨胀后的减去腐蚀过的
img=cv2.imread("./image/test.png")
img=cv2.resize(img,(0,0),fx=0.6,fy=0.6)
kernel=np.ones((3,3),np.uint8)
#梯度运算
imgGradient=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
cv2.imshow("init",img)
cv2.waitKey(0)
cv2.imshow("gradient",imgGradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
五、礼帽与黑帽
img=cv2.imread("./image/test.png")
img=cv2.resize(img,(0,0),fx=0.6,fy=0.6)
kernel=np.ones((3,3),np.uint8)
#礼帽 原始图像-开运算
imgTophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
#黑帽 闭运算-原始图像
imgBlackhat=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
cv2.imshow("init",img)
cv2.waitKey(0)
cv2.imshow("tophat",imgTophat)
cv2.waitKey(0)
cv2.imshow("blackhat",imgBlackhat)
cv2.waitKey(0)
cv2.destroyAllWindows()
六、soble、scharr、lapkacian算子边缘检测
1、soble:
#soble 边缘检测滤波器
img=cv2.imread("./image/test.png")
img=cv2.resize(img,(0,0),fx=0.6,fy=0.6)
#直接进行两个方向的边缘检测
sobelD=cv2.Sobel(img,cv2.CV_32F,1,1,ksize=3)
sobelD=cv2.convertScaleAbs(sobelD)
#水平方向进行边缘检测
sobelX=cv2.Sobel(img,cv2.CV_32F,1,0,ksize=3) #第二个参数CV_32F 可以为负数,再转换为正数,就可以把检测为负数的边缘也检测出来
sobelX = cv2.convertScaleAbs(sobelX) #白到黑是正数,黑到白就是负数了,所有的负数会被截断成0,所以要取绝对值
#垂直方向进行边缘检测
sobelY=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobelY = cv2.convertScaleAbs(sobelY)
#把两个方向综合起来,建议
sobelXY=cv2.addWeighted(sobelX,1,sobelY,1,0)
cv2.imshow("init",img)
cv2.waitKey(0)
cv2.imshow("sobelD",sobelD)
cv2.waitKey(0)
cv2.imshow("sobelX",sobelX)
cv2.waitKey(0)
cv2.imshow("sobelY",sobelY)
cv2.waitKey(0)
cv2.imshow("sobelXY",sobelXY)
cv2.waitKey(0)
cv2.destroyAllWindows()
2、scharr:(与soble仅仅核不一样,更细腻)
scharrX = cv2.Scharr(img,cv2.CV_64F,1,0)
scharrY = cv2.Scharr(img,cv2.CV_64F,0,1)
scharrX = cv2.convertScaleAbs(scharrX)
scharrY = cv2.convertScaleAbs(scharrY)
scharrXY = cv2.addWeighted(scharrX,1,scharrY,1,0)
cv2.imshow("scharrXY",scharrXY)
3、Laplacian,二阶,不再分水平垂直两个方向,上下左右和中间对比
laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
七、candy边缘检测
步骤:
(1) 使用高斯滤波器,以平滑图像,滤除噪声。
(2) 计算图像中每个像素点的梯度强度和方向。
(3) 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
(4) 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
(5) 通过抑制孤立的弱边缘最终完成边缘检测。
#candy边缘检测
#宽松的阈值
canny1=cv2.Canny(img,5,80)
#比较严格的阈值
canny2=cv2.Canny(img,70,80)