计算机视觉入门(二)

文章目录

  • 1.腐蚀操作
  • 2.膨胀操作
  • 3.开运算与闭运算
  • 4.梯度运算
  • 5.礼帽与黑帽
  • 6.计算图像梯度
    • 6.1. Sobel算子
    • 6.2. Scharr算子与 laplacian算子
  • 7.图像平滑处理
    • 7.1.均值滤波
    • 7.2.方框滤波
    • 7.3.高斯滤波
    • 7.4.中值滤波
  • 8.图像阈值
  • 9.图像灰度化
  • 10.Canny边缘检测

1.腐蚀操作

#形态学-腐蚀操作
img = cv2.imread('dog.jpg',cv2.IMREAD_GRAYSCALE)
# cv2.imshow('img', img)
# cv2.waitKey(0)#等待时间,毫秒级别 0表示任意键终止
# cv2.destroyAllWindows()#触发条件时,关闭
img= cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#plt.imshow(img)
#plt.show()
#形态学腐蚀操作44)表示一次操作所腐蚀的范围,iterations:表示腐蚀操作进行多少次
 kernel=np.ones((4,4),np.uint8)
 erosion=cv2.erode(img,kernel,iterations=5)
 plt.imshow(erosion)
 plt.show()

计算机视觉入门(二)_第1张图片

2.膨胀操作

#膨胀操作
#(4,4)表示一次操作所膨胀的范围,iterations:表示膨胀操作进行多少次
kernel=np.ones((4,4),np.uint8)
img_dilate=cv2.dilate(img,kernel,iterations=6)
plt.imshow(img_dilate)
plt.show()

计算机视觉入门(二)_第2张图片

3.开运算与闭运算

#开:先腐蚀 再膨胀
kernel=np.ones((4,4),np.uint8)
opening=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
#闭:先膨胀 后腐蚀
kernel = np.ones((4, 4), np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

4.梯度运算

#梯度=膨胀-腐蚀
pie=cv2.imread('img1.jpg')
kernel=np.ones((20,20),np.uint8)
erode=cv2.erode(pie,kernel,iterations=2)
dilate=cv2.dilate(pie,kernel,iterations=2)
res=np.hstack((pie,erode,dilate))
plt.imshow(res)
plt.show()
gradient=cv2.morphologyEx(pie,cv.MORPH_GRADIENT,kernel)
plt.imshow(gradient)
plt.show()

5.礼帽与黑帽

#礼帽=原始输入-开运算结果
tophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
plt.imshow(tophat)
plt.show()

计算机视觉入门(二)_第3张图片

blackhat=cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
plt.imshow(blackhat)
plt.show()

计算机视觉入门(二)_第4张图片

6.计算图像梯度

6.1. Sobel算子

计算机视觉入门(二)_第5张图片

#sobel算子
#ddpeth:图像深度(通常为-1)  dx和dy表示水平和竖直方向  ksize是Sobel算子的大小
# dst=cv2.Sobel(src,ddepth,dx,dy,ksize)
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)#dx=1表示算水平不算竖直,只有边界才有梯度
plt.imshow(sobelx)
plt.show()

计算机视觉入门(二)_第6张图片

sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)#dx=1表示算水平不算竖直,只有边界才有梯度(右边减左边)
#白减黑是正数 黑到白是负数 负数被截断
sobelx=cv2.convertScaleAbs(sobelx)#将值转换为正数
plt.imshow(sobelx)
plt.show()

计算机视觉入门(二)_第7张图片

sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)#dx=1表示算水平不算竖直,只有边界才有梯度(右边减左边)
#白减黑是正数 黑到白是负数 负数被截断
sobelx=cv2.convertScaleAbs(sobelx)#将值转换为正数
plt.imshow(sobelx)
plt.show()

计算机视觉入门(二)_第8张图片

#(垂直方向进行梯度运算)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobely = cv2.convertScaleAbs(sobely)  #将值转换为正数
plt.imshow(sobely)
plt.show()

计算机视觉入门(二)_第9张图片

算出x,y 然后将x,y一起算
#分别算X,Y 再求和
sobelxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
plt.imshow(sobelxy)
plt.show()


计算机视觉入门(二)_第10张图片

6.2. Scharr算子与 laplacian算子

计算机视觉入门(二)_第11张图片
计算机视觉入门(二)_第12张图片

#Scharr算子
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,0.5,scharry,0.5,0)
plt.imshow(sobelxy)
plt.show()

#laplacian算子
laplacian=cv2.Laplacian(img,cv2.CV_64F)
laplacian=cv2.convertScaleAbs(laplacian)
plt.imshow(laplacian)
plt.show()

res=np.hstack((sobelxy,scharrxy,laplacian))
plt.imshow(res)

计算机视觉入门(二)_第13张图片

7.图像平滑处理

7.1.均值滤波

计算机视觉入门(二)_第14张图片

#均值滤波:简单的平均卷积操作
blur=cv2.blur(img,(3,3))
res = np.hstack((img,blur))
plt.imshow(res)
plt.show()

计算机视觉入门(二)_第15张图片

7.2.方框滤波

#方框滤波:true为进行归一化
box=cv2.boxFilter(img,-1,(3,3),normalize=False)
res = np.hstack((img, box))
plt.imshow(res)
plt.show()

计算机视觉入门(二)_第16张图片

7.3.高斯滤波

#高斯滤波:满足高斯分布
aussian=cv2.GaussianBlur(img,(5,5),1)
res = np.hstack((img, aussian))
plt.imshow(res)
plt.show()

计算机视觉入门(二)_第17张图片

7.4.中值滤波

#中值滤波(效果最好)
median=cv2.medianBlur(img,5)
res = np.hstack((img, median))

8.图像阈值

  • ret,dst=cv2.threshold(src,thresh,maxval,type)
    src:输入图,只能输入单通道图像,一般为灰度图
    dst:输出图
    thresh:阈值
    maxval:当像素值超过阈值(或者小于阈值),所赋予的值
    type:二值化(大于取一个值,小于取另一个值)操作的类型,包含五种类型
  • THRESH_BINARY:超过阈值部分取maxval,否则为0
  • THRESH_BINARY_INV: THRESH_BINARY的反转
  • THRESH_TRUNC:大于阈值部分设为阈值,否则不变
  • THRESH_TOZERO:大于阈值部分不改变,否则设为0
  • THRESH_TOZERO_INV: THRESH_TOZERO的反转
ret,thresh1=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret,thresh2=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3=cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
ret,thresh4=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
ret,thresh5=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
title=['Original','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images=[img,thresh1,thresh2,thresh3,thresh4,thresh5]
for i in range(6):
    plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
    plt.title(title[i])
    plt.xticks([]),plt.yticks([])

计算机视觉入门(二)_第18张图片
计算机视觉入门(二)_第19张图片

9.图像灰度化

img = cv2.imread('dog.jpg',cv2.IMREAD_GRAYSCALE)
# cv2.imshow('img', img)
# cv2.waitKey(0)#等待时间,毫秒级别 0表示任意键终止
# cv2.destroyAllWindows()#触发条件时,关闭
img= cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()

计算机视觉入门(二)_第20张图片

10.Canny边缘检测

  • 使用高斯滤波,以平滑图像,滤除噪声
  • 计算图像中每个像素点的梯度强度和方向
  • 应用非极大值(Non-Maximum-Suppression)抑制,以消除边缘检测带来的杂散响应
  • 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘
  • 通过抑制孤立的弱边缘最终完成边缘检测
    计算机视觉入门(二)_第21张图片计算机视觉入门(二)_第22张图片
    计算机视觉入门(二)_第23张图片
    计算机视觉入门(二)_第24张图片
img = cv2.imread("dog.jpg", cv2.IMREAD_GRAYSCALE)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# plt.imshow(img)
# plt.show()
#Canny边缘检测
v1=cv2.Canny(img,120,250)#minVal=80 maxVal=150
v2=cv2.Canny(img,50,100)
res=np.hstack((v1,v2))
plt.imshow(res)
plt.show()

计算机视觉入门(二)_第25张图片

你可能感兴趣的:(Python计算机视觉,计算机视觉,opencv,python)