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 |
#滤波
#均值滤波
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.采用抑制孤立的若边缘最终完成边缘检测
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)