python图像处理opencv学习心得
提示:以下是本篇文章正文内容,下面案例可供参考
一、腐蚀
import cv2
import numpy as np
img = cv2.imread('dick.jpg')
kernel = np.ones((4,4),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 2)
cv2.startWindowThread()
cv2.imshow('erosion',erosion)
cv2.waitKey(0)
图片img,规则kernel,次数iterations
二、膨胀
import cv2
import numpy as np
img = cv2.imread('dick.jpg')
kernel = np.ones((4,4),np.uint8)
erosion = cv2.dilate(img,kernel,iterations = 2)
cv2.startWindowThread()
cv2.imshow('erosion',erosion)
cv2.waitKey(0)
三、腐蚀然后膨胀,可以控制腐蚀和膨胀的次数
import cv2
import numpy as np
img = cv2.imread('dick.jpg')
kernel = np.ones((4,4),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 2)
pz = cv2.dilate(erosion,kernel,iterations = 2)
cv2.startWindowThread()
cv2.imshow('pz',pz)
cv2.waitKey(0)
四、开/闭运算,一次腐蚀和一次膨胀
开:先腐蚀再膨胀
img = cv2.imread('dick.jpg')
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
cv2.startWindowThread()
cv2.imshow('opening',opening)
cv2.waitKey(0)
闭:先膨胀再腐蚀
img = cv2.imread('dick.jpg')
kernel = np.ones((5,5),np.uint8)
closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
cv2.startWindowThread()
cv2.imshow('closing',closing)
cv2.waitKey(0)
五、梯度运算
梯度=膨胀-腐蚀
import cv2
import numpy as np
img = cv2.imread('dick.jpg')
kernel = np.ones((5,5),np.uint8)
dilate = cv2.dilate(img,kernel,iterations = 5)
erosion = cv2.erode(img,kernel,iterations = 5)
res = np.hstack((dilate,erosion))
cv2.imshow('res',res)
cv2.waitKey(0)
gradient = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
cv2.imshow('gradient',gradient)
cv2.waitKey(0)
六、礼帽和黑帽
礼帽=原始输入-开运算
img = cv2.imread('dick.jpg')
tophat = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
cv2.imshow('tophat',tophat)
cv2.waitKey(0)
黑帽=闭运算-原始输入
img = cv2.imread('dick.jpg')
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
cv2.imshow('blackhat',blackhat)
cv2.waitKey(0)
七、图像梯度-Sobel算子
用来检测图像边缘
使用灰度图像来进行运算
模型:dst = cv2.Sobel(src,ddepth,dx,dy,ksize)
#ddepth:图像深度
#dx和dy分别表示水平和数值方向,dx=1,dy=0表示水平 dx=0,dy1表示竖直
#ksize是Sobel算子的大小
#灰度图像转换
import cv2
img = cv2.imread('wanye.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow('img',img)
cv2.waitKey(0)
#为了读取图像方便,这里创建了一个读取图像并展示的函数,方便以后调用
def cv_show(img,name):
cv2.imshow(name,img)
cv2.waitKey(0)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
#ksize=3就是3x3的矩阵
#CV_64F让右减左即黑白像素深度相减之后数值有正有负(原来像素深度只有0-255),opencv默认负数为0
sobelx = cv2.convertScaleAbs(sobelx)
#白到黑是整数,黑到白因为CV_64F变成了负数,要得到图像轮廓就要取绝对值
cv_show(sobelx,'soblex')
#以上算完了水平的轮廓,上下存在深度差的点没算出来,所以要再进行一次上下的求值,dx=0,dy=1
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
cv_show(sobely,'sobley')
#接下来把左右的图像和上下的图像进行拼接,得到完整的轮廓。ps:如果一次得出结论(dx=1,dy=1)的话,图像会失真
#所以切记要左右和上下分开算,再相加
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
#addWeighted的用法是边缘相加:(左右/上下,权重,上下/左右,权重,偏置项-一般为0)
cv_show(sobelxy,'sobelxy')
图像梯度-Scharr算子:更加敏感,差异明显
图像梯度-laplacian算子:相当于二阶导的sobel,对噪音更加敏感
未完待续
更新时间2022.4.3