0
点赞
收藏
分享

微信扫一扫

python图像处理opencv学习,形态学

哈哈我是你爹呀 2022-04-03 阅读 60
pythonopencv

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

举报

相关推荐

0 条评论