【Opencv】opencv-python学习笔记(基本操作,图像融合,图像平滑,阈值,膨胀腐蚀等)

截取图像

在这里插入图片描述

图像融合

在这里插入图片描述

读取视频调整帧速显示

末行cv2.waitKey(10)数值的改变可以改变播放速率

import cv2
import numpy as np


cap =cv2.VideoCapture(r"D:\EP11.mp4")
isOpened = cap.isOpened()  ##判断视频是否打开
print(isOpened)
fps = cap.get(cv2.CAP_PROP_FPS)  ##获取帧率
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))   ###获取宽度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))   ###获取高度
print(fps,width,height)
i=0
#读取视频时长(帧总数)
total = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print("[INFO] {} total frames in video".format(total))
while isOpened:
    # Take each frame
    (flag, frame)=cap.read()
    if flag == True:
        gray=cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY)
        cv2.imshow('result',gray)
        if cv2.waitKey(10)&0xff==27:
            break
    else:
        break

图像阈值

在这里插入图片描述

# 图像阈值
from matplotlib import pyplot as plt
import cv2
img = cv2.imread('d:/pp.jpg')
img_gray=cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
ret,thresh1=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)
ret,thresh2=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3=cv2.threshold(img_gray,127,255,cv2.THRESH_TRUNC)
ret,thresh4=cv2.threshold(img_gray,127,255,cv2.THRESH_TOZERO)
ret,thresh5=cv2.threshold(img_gray,127,255,cv2.THRESH_TOZERO_INV)

titles=['original','binary','binary_inv','trunc','tozero','tozero_inv']
imgs=[img,thresh1,thresh2,thresh3,thresh4,thresh5]

for i in range(6):
    plt.subplot(2,3,i+1),plt.imshow(imgs[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

在这里插入图片描述

图像平滑(滤波操作)

# 图像阈值
from matplotlib import pyplot as plt
import cv2
img = cv2.imread('d:/zy.jpg')
# 若要用Matplot显示就先把bgr转换成rgb,img_c显示即可,opencv imshow时仍用img
b, g, r = cv2.split(img)
img_c = cv2.merge([r, g, b])
img_gray=cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
# ret,thresh1=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)
# ret,thresh2=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY_INV)
# ret,thresh3=cv2.threshold(img_gray,127,255,cv2.THRESH_TRUNC)
# ret,thresh4=cv2.threshold(img_gray,127,255,cv2.THRESH_TOZERO)
# ret,thresh5=cv2.threshold(img_gray,127,255,cv2.THRESH_TOZERO_INV)
#
# titles=['original','binary','binary_inv','trunc','tozero','tozero_inv']
# imgs=[img,thresh1,thresh2,thresh3,thresh4,thresh5]
#
# for i in range(6):
#     plt.subplot(2,3,i+1),plt.imshow(imgs[i],'gray')
#     plt.title(titles[i])
#     plt.xticks([]),plt.yticks([])
# plt.show()

#图像平滑
# 1.均值滤波(简单的平均卷积操作)
blur=cv2.blur(img_c,(3,3))
# 使用3*3的卷积

# 2.方框滤波
# 归一化,即同等于均值滤波
box=cv2.boxFilter(img_c,-1,(3,3),normalize=True)
# 未归一化,会出现越界现象,都显示加起来后的像素值,由于最大255取255大多均为白的
box2=box=cv2.boxFilter(img_c,-1,(3,3),normalize=False)

# 3.高斯滤波
# 卷积时不直接相加,按高斯函数分配不同的比例值相乘后相加
Gussian=cv2.GaussianBlur(img_c,(5,5),1)

# 4.中值滤波
# 相当于用(5*5)范围内的25个数中的中值代替该像素
median=cv2.medianBlur(img_c,5)

# 展示所有滤波
# import numpy as np
# # 横着拼接成一张图,如果纵着则改成ystack
# res=np.hstack((img,blur,box,Gussian,median))
# cv2.imshow('img,blur,box,Gussian,median',res)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
imgs=[img_c,blur,box,Gussian,median]
titles=['img','blur','box','Gussian','median']
for i in range(5):
    plt.subplot(2,3,i+1),plt.imshow(imgs[i])
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

在这里插入图片描述

膨胀腐蚀——形态学操作

在这里插入图片描述

# 腐蚀和膨胀是最基本的形态学运算。
# 腐蚀和膨胀是针对白色部分(高亮部分)而言的。
# 膨胀就是对图像高亮部分进行“领域扩张”,效果图拥有比原图更大的高亮区域;
# 【腐蚀】——去刺儿,是原图中的高亮区域被蚕食,效果图拥有比原图更小的高亮区域。
# 【膨胀】--原图变粗,是求局部最大值的操作,从图像直观看来,就是将图像光亮部分放大,黑暗部分缩小
# 开运算:先腐蚀再膨胀,用来消除小物体
# 闭运算:先膨胀再腐蚀,用于排除小型黑洞
# 形态学梯度:就是膨胀图与俯视图之差,用于保留物体的边缘轮廓。
# 顶帽:原图像与开运算图之差,用于分离比邻近点亮一些的斑块。
# 黑帽:闭运算与原图像之差,用于分离比邻近点暗一些的斑块。
import numpy as np
kernel=np.ones((30,30),np.uint8)
erosion=cv2.erode(img_c,kernel,iterations=1)
dilate=cv2.dilate(img_c,kernel,iterations=1)
opening=cv2.morphologyEx(img_c,cv2.MORPH_OPEN,kernel)
closing=cv2.morphologyEx(img_c,cv2.MORPH_CLOSE,kernel)
gradient=cv2.morphologyEx(img_c,cv2.MORPH_GRADIENT,kernel)
tophat=cv2.morphologyEx(img_c,cv2.MORPH_TOPHAT,kernel)
blackhat=cv2.morphologyEx(img_c,cv2.MORPH_BLACKHAT,kernel)


imgs=[img_c,erosion,dilate,opening ,closing,gradient,tophat,blackhat]
titles=['img','erosion','dilate','opening' ,'closing','gradient','tophat','blackhat']
for i in range(7):
    plt.subplot(3,3,i+1),plt.imshow(imgs[i])
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

在这里插入图片描述

梯度——不同算子

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# 梯度计算中使用不同算子
# sobel(GX是右减左,GY是下减上)
sobel_x=cv2.Sobel(img_c,cv2.CV_64F,1,0,ksize=3)
sobel_x=cv2.convertScaleAbs(sobel_x)
sobel_y=cv2.Sobel(img_c,cv2.CV_64F,0,1,ksize=3)
sobel_y=cv2.convertScaleAbs(sobel_y)
sobelxy=cv2.addWeighted(sobel_x,0.5,sobel_y,0.5,0)
# 直接计算(不建议这样)
sobelxy2=cv2.Sobel(img_c,cv2.CV_64F,1,1,ksize=3)

# scharr
scharr_x=cv2.Scharr(img_c,cv2.CV_64F,1,0)
scharr_x=cv2.convertScaleAbs(scharr_x)
scharr_y=cv2.Scharr(img_c,cv2.CV_64F,0,1)
scharr_y=cv2.convertScaleAbs(scharr_y)
scharrxy=cv2.addWeighted(scharr_x,0.5,scharr_y,0.5,0)

# 拉普拉斯算子

laplacian=cv2.Laplacian(img_c,cv2.CV_64F)
laplacian=cv2.convertScaleAbs(laplacian)

imgs=[img_c,sobelxy,sobelxy2,scharrxy,laplacian]
titles=['img','sobelxy','sobelxy2(NOTUSE)','scharrxy','laplacian']
for i in range(5):
    plt.subplot(2,3,i+1),plt.imshow(imgs[i])
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

保护朋友隐私权233333(遮脸~)在这里插入图片描述

边缘检测——Canny边缘检测

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码不多,主要理解几个步骤。

# 边缘检测
v1=cv2.Canny(img_gray,80,150)
v2=cv2.Canny(img_gray ,50,100)
res=np.hstack((v1,v2))
cvshow(res)

在这里插入图片描述

-----------EchoZhang----比较懒的记录------2020/03/26-------

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值