OpenCV

OpenCV,第1张

OpenCV 学习笔记 0、opencv的安装
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

一、计算机图像

一般都是三通道图像,RGB,值为0-255。单通道图片只有一个通道

cv2.IMREAD_COLOR#表示彩色图
cv2.IMREAD_GRAYSCALE#表示灰度图
二、OpenCV 常用的接口 1.图像的基本 *** 作 1.1常用imread读取图像,返回的是一个三维数组
import numpy as np
import cv2
img = cv2.imread('test.jpg')#读取test,jpg文件  返回的是BGR,虽然很多地方我们见到的都是RGB 返回的img是numpy格式
1.2用imshow()展示图片
img = cv2.imread('test.jpg')
cv2.imshow("title",img)#传入两个变量,分别为title和img
cv2.waitKey(0)#停顿xxx毫秒,特别的为0的时候表示按下任意键继续
1.3属性(shape属性)
#展示图像的属性
print(img.shape)
#output:(366, 500, 3)表示366*500*3
1.4保存
#将这张灰度图进行保存
cv2.imwrite("test_hui.jpg",img2)
1.5读取视频
#读取视频
video = cv2.VideoCapture('video.mp4')
if video.isOpened():
    open,frame = video.read()
else:
    open = False

while open:
    if frame is None:
        break
    if open ==True:
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        cv2.imshow('title',gray)
        cv2.waitKey(100)

    open, frame = video.read()

video.release()
1.6图像切片
#bgr图像切片
img3 = cv2.imread("test.jpg")
b,g,r = cv2.split(img3)
img4 = cv2.merge((b,g,r))
cv2.imshow("title",img4)
cv2.waitKey(0)

改变通道值,产生图片

#产生红绿蓝色通道的图片
img4 = cv2.imread("test.jpg")
img4_red = img4.copy()#一定要加上copy,因为如果直接赋值的话是浅拷贝
img4_red[:,:,0] = 0
img4_red[:,:,1] = 0
cv2.imwrite("test_red.jpg",img4_red)

img4_green = img4.copy()
img4_green[:,:,0] = 0
img4_green[:,:,2] = 0
cv2.imwrite("test_green.jpg",img4_green)

img4_blue = img4.copy()
img4_blue[:,:,1] = 0
img4_blue[:,:,2] = 0
cv2.imwrite("test_blue.jpg",img4_blue)
1.7 边界填充
cv2.copyMakeBorder(image, top, bottom, left, right, borderType)
1.8 图像改变大小resize函数
#图像融合
img5 = cv2.imread("test.jpg")
img6 = cv2.imread("pika.jpg")
h= img6.shape[0]
w= img6.shape[1]
img5 = cv2.resize(img5,(w,h))
img5 = img5 + img6
cv2.imshow("title",img5)
cv2.waitKey(0)
1.9图像阈值 *** 作
cv2.threshold (src, thresh, maxval, type)

type的取值

type解释
cv2.THRESH_BINARY二进制阈值化,非黑即白
cv2.THRESH_BINARY_INV反二进制阈值化,非白即黑
cv2.THRESH_TRUNC截断阈值化 ,大于阈值设为阈值
cv2.THRESH_TOZERO阈值化为0 ,小于阈值设为0
cv2.THRESH_TOZERO_INV反阈值化为0 ,大于阈值设为0
2.图像处理 *** 作 2.1滤波
#滤波

#均值滤波
img = cv2.imread("noise1.jpg")
cv2.imshow("title",img)
cv2.waitKey(0)
blur = cv2.blur(img,(3,3))#(3,3)为卷积核
cv2.imshow("title",blur)
cv2.waitKey(0)

#方框滤波,调用的函数跟均值滤波不一样但其实效果是一样的
img = cv2.imread("noise1.jpg")
cv2.imshow("title",img)
cv2.waitKey(0)
box = cv2.boxFilter(img,-1,(3,3),normalize=True)#(3,3)为卷积核
cv2.imshow("title",box)
cv2.waitKey(0)

# #高斯滤波
img = cv2.imread("noise1.jpg")
cv2.imshow("title",img)
cv2.waitKey(0)
box = cv2.GaussianBlur(img,(5,5),1)#(3,3)为卷积核
cv2.imshow("title",box)
cv2.waitKey(0)

# #中值滤波
img = cv2.imread("noise1.jpg")
cv2.imshow("title",img)
cv2.waitKey(0)
box = cv2.medianBlur(img,5)
cv2.imshow("title",box)
cv2.waitKey(0)
2.2腐蚀
#腐蚀
img = cv2.imread("noise1.jpg")
cv2.imshow("title",img)
cv2.waitKey(0)
kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations=1)
cv2.imshow("title",erosion)
cv2.imwrite("noise1_ero.jpg",erosion)
cv2.waitKey(0)
2.3 膨胀
#膨胀
img = cv2.imread("noise1_ero.jpg")
cv2.imshow("title",img)
cv2.waitKey(0)
kernel = np.ones((3,3),np.uint8)
dige_dilate = cv2.dilate(img,kernel,iterations= 1)
cv2.imshow("title",dige_dilate)
cv2.imwrite("noise1_ero_dilate.jpg",dige_dilate)
cv2.waitKey(0)
2.4开运算
#开运算:先腐蚀再膨胀

img = cv2.imread("noise1.jpg")
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
cv2.imshow('title',opening)
cv2.waitKey(0)
2.5闭运算
#闭运算:先膨胀再腐蚀
img = cv2.imread("noise1.jpg")
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)#形态学运算函数
cv2.imshow('title',opening)
cv2.waitKey(0)
2.6梯度计算
#梯度计算 = 膨胀 - 腐蚀
pie = cv2.imread("noise.jpg")
kernel = np.ones((7,7),np.uint8)
gradient = cv2.morphologyEx(pie,cv2.MORPH_GRADIENT,kernel)
cv2.imshow('title',gradient)
cv2.waitKey(0)
2.7礼帽和黑帽
# 礼帽和黑帽
# 礼帽 = 原图像 - 开运算结果
img = cv2.imread('noise1.jpg')
kernel = np.ones((7,7),np.uint8)
tophat = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
cv2.imshow('title',tophat)
cv2.waitKey(0)



# 黑帽 = 闭运算 - 原图像

img = cv2.imread('noise1.jpg')
kernel = np.ones((7,7),np.uint8)
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
cv2.imshow('title',blackhat)
cv2.waitKey(0)
3.图像边缘处理 3.1sobel算子

dst = cv2.Sobel(src,ddepth,dx,dy,ksize)

  • ddepth:图像的深度
  • dx dy分别表示水平和竖直的方向
  • ksize是sobel算子的大小
# sobel算子
img = cv2.imread("cycle.jpg")
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
cv2.imshow("title",sobelx)
cv2.waitKey(0)


sobelx = cv2.convertScaleAbs(sobelx)
cv2.imshow("title",sobelx)
cv2.waitKey(0)
# sobel算子
img = cv2.imread("cycle.jpg")
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
cv2.imshow("title",sobelx)
cv2.waitKey(0)

sobelx = cv2.convertScaleAbs(sobelx)
cv2.imshow("title",sobelx)
cv2.waitKey(0)

#sobel 边缘检测
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv2.imshow("title",sobelxy)
cv2.waitKey(0)
3.2 sobel边缘检测
#sobel边缘检测实例
img = cv2.imread("noise.jpg",cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv2.imshow("title",sobelxy)
cv2.waitKey(0)
3.3 Scharr算子(更敏感)
#scharrx 边缘检测
img = cv2.imread("noise.jpg",cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Scharr(img,cv2.CV_64F,1,0)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Scharr(img,cv2.CV_64F,0,1)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv2.imshow("title",sobelxy)
cv2.waitKey(0)
3.4 laplacian算子

(敏感,但同时对噪音也比较敏感,一般跟其他方法一起使用)

#laplacian 边缘检测
img = cv2.imread("noise.jpg",cv2.IMREAD_GRAYSCALE)
laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
cv2.imshow("title",laplacian)
cv2.waitKey(0)
3.5 Canny 边缘检测
  • 1.使用高斯滤波,消除噪声
  • 2.计算每个像素点的梯度强度和方向
  • 3.采用非极大值抑制,消除杂散效应
  • 4.采用双阈值检测确定正式和潜在的边缘
  • 5.采用抑制孤立的若边缘最终完成边缘检测
    感,但同时对噪音也比较敏感,一般跟其他方法一起使用)**
#laplacian 边缘检测
img = cv2.imread("noise.jpg",cv2.IMREAD_GRAYSCALE)
laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
cv2.imshow("title",laplacian)
cv2.waitKey(0)
3.5 Canny 边缘检测
  • 1.使用高斯滤波,消除噪声
  • 2.计算每个像素点的梯度强度和方向
  • 3.采用非极大值抑制,消除杂散效应
  • 4.采用双阈值检测确定正式和潜在的边缘
  • 5.采用抑制孤立的若边缘最终完成边缘检测

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/715723.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存