原图:
#腐蚀操作erode
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations=5)
#通过更改卷积核大小和迭代次数都会影响腐蚀区域大小
cv2.imshow('erosion',erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
plt.imshow(erosion)
plt.show()
效果:
erosion1 = cv2.erode(img,kernel,iterations=1)
erosion2 = cv2.erode(img,kernel,iterations=20)
erosion3 = cv2.erode(img,kernel,iterations=30)
res = np.hstack((erosion1,erosion2,erosion3))
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
plt.imshow(res)
plt.show()
效果:
#膨胀操作dilate
kernel = np.ones((3,3),np.uint8)
dilate = cv2.dilate(img_,kernel,iterations=5)
#通过更改卷积核大小和迭代次数都会影响膨胀区域大小
cv2.imshow('dilate',dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()
plt.imshow(dilate)
plt.show()
效果:
#开运算MPRPH_OPEN与闭运算MPRPH_CLOSE
#开:先腐蚀,再膨胀 =原始输入
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(img_,cv2.MORPH_OPEN,kernel)
#闭:先膨胀,再腐蚀
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(img_,cv2.MORPH_CLOSE,kernel)
原图:开运算:闭运算:
#梯度运算GRADIENT
# 梯度 = 膨胀-腐蚀
kernel = np.ones((3,3),np.uint8)
gradient = cv2.morphologyEx(img_,cv2.MORPH_GRADIENT,kernel)
cv2.imshow('gradient',gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
plt.imshow(gradient)
plt.show()
#礼帽MORPH_TOPHAT和黑帽 MORPH_TOPHAT
# 礼帽:原始输入-开运算结果 MORPH_TOPHAT 只剩刺
img= cv2.imread('dot1.png')
tophat =cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
cv2.imshow('tphat',tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
res = np.hstack((img,tophat))
plt.imshow(res)
plt.show()
# 礼帽:原始输入-开运算结果 MORPH_TOPHAT 只剩刺
img= cv2.imread('dot1.png')
tophat =cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
cv2.imshow('tphat',tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
res = np.hstack((img,tophat))
plt.imshow(res)
plt.show()
#图像梯度--Sobel算子
img = cv2.imread('cat1.jpg',cv2.IMREAD_GRAYSCALE)
img_=cv2.resize(img,(0,0),fx=0.2,fy=0.2)
cv2.imshow('img',img_)
cv2.waitKey(0)
cv2.destroyAllWindows()
dst = cv2.Sobel(src,ddepth,dx,dy,ksize)
ddepth:图像的深度 一般是-1
dx 和 dy 分别表示水平和竖直方向 Gx还是Gy
ksize 是Sobel 算子的大小 卷积核大小
白到黑是整数,黑到白是复数,所有的负数会被截断成0,所以要取绝对值
sobely = cv2.Sobel(img_,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
#算负数的绝对值
cv_show(sobely,'sobely')
plt.imshow(sobely)
plt.show()
#sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0) 要求是dtype要一致,下面就强制转换了这两个的dtype
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0, dtype = cv2.CV_32F)
cv_show(sobelxy,'sobelxy')
plt.imshow(sobelxy)
plt.show()
#Scharr算子(二阶算子,梯度更大)
# laplacian算子 对噪点敏感
#
scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scharry = cv2.Scharr(img,cv2.CV_64F,1,0)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
laplacian =cv2.Laplacian(img,cv2.CV_64F)
laplacian =cv2.convertScaleAbs(laplacian)
res = np.hstack((scharrxy,laplacian))
cv_show(res,'res')
titles = ['sobelxy','scharrxy','laplacian']
images = [sobelxy,scharrxy,laplacian]
for i in range(3):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()