图像基本操作

图像读取

import cv2 #opencv读取图片的格式为BGR
#读取图片 第一个参数为图片路径 第二个参数图片类型有两个选项 
#1.cv2.IMREAD_COLOR彩色图像 (默认) 2.cv2.IMREAD_GRAYSCALE:灰度图像
img = cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE) 
#图片展示:
def cv_show(name, img):
	cv2.imshow(name, img) #name:给图片起一个名字,img:要展示的图片
	cv2.WaitKey(0)         #展示图片的时间
	cv2.destroyAllWindows() #展示解释后释放内存
#图片大小
img.shape
#图片保存
cv2.imwrite('mycat.png',img)
#图片像素点个数
img.size

图像操作

#截取部分图像
cat = img[0:200, 0:200]
#颜色通道读取
b, g, r = cv2.split(img)
#通道合成
img = cv2.merge((b, g, r))
#只保留某个通道
cur_img = img.copy()#图像复制
cur_img[:,:,0] = 0
cur_img[:,:,1] = 0
cv_show('R', cur_img)
#边界填充
#参数1.要填充的图像 2,3,4,5 分别时上下左右要填充的尺寸,
#参数6:(borderType)是填充方式,填充方式有:
- BORDER_REPLICATE:复制法,也就是复制最边缘像素。
- BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb   
- BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
- BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg  
- BORDER_CONSTANT:常量法,常数值填充。
img = cv2.copyMakeBorder(img, top_size, bottom_size,left_size,right_size, borderType = cv2.BORDER_REPLICATE)
#数值计算
img_cat2 = img_cat + 10 #所有像素点加10
img =img_cat+ img_cat2 #如果超出[0,255]的范围则  %256
cv2.add(img_cat, img_cat2) #如果超出范围则取255
#图像融合 首相将两张图片裁剪成相同大小
img = cv2.resize(img, ( , ))
img = cv2.resize(img, (0,0),fx=4, fy=4) #调整长宽的比例
#根据不同的权重融合 a1X1 + a2X2 + b 
res = cv2.addWeighted(img, 0.4, img2, 0.6, 0)

图像平滑

#均值滤波 简单的平均卷积操作
blur = cv2.blur(img, (3,3)) #()为卷积核大小
# 方框滤波:基本和均值一样,可以选择归一化
box = cv2.boxFilter(img,-1,(3,3), normalize=True) 
# 高斯滤波:高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
aussian = cv2.GaussianBlur(img, (5, 5), 1) #1是高斯核的方差
# 中值滤波:相当于用中值代替
median = cv2.medianBlur(img, 5)  # 中值滤波 5是卷积核大小

图像形态学

#腐蚀
erosion = cv2.erode(img, kernel, iterations = 1)
#膨胀
img_dilate = cv2.dilate(img, kernel, iterations = 1)
#开运算: 先腐蚀再膨胀
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
#闭运算 先膨胀后腐蚀
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
#礼帽(顶帽): 原始输入-开运算结果
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT,kernel)
#黑帽: 闭运算-原始输入
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

图像处理

#颜色空间转换函数,p1是需要转换的图片,p2是转换成何种格式
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY  
                        / cv2.COLOR_BGR2HSV)
#图像阈值
ret, dst = cv2.threshold(src, thresh,maxval, type)
- src: 输入图,只能输入单通道图像,通常来说为灰度图
- dst: 输出图
- thresh: 阈值
- ret:返回我们指定的阈值thresh
- maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
- type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
- cv2.THRESH_BINARY           超过阈值部分取maxval(最大值),否则取0
- cv2.THRESH_BINARY_INV    THRESH_BINARY的反转
- cv2.THRESH_TRUNC            大于阈值部分设为阈值,否则不变
- cv2.THRESH_TOZERO          大于阈值部分不改变,否则设为0
- cv2.THRESH_TOZERO_INV  THRESH_TOZERO的反转

图像梯度

1.Sobel算子
在这里插入图片描述

dst = cv2.Sobel(src, ddepth,dx, dy, ksize)
- ddepth:图像的深度
- dx和dy分别表示水平和竖直方向
- ksize是Sobel算子的大小

在函数cv2.Sobel()的语法中规定,可以将函数cv2.Sobel()内ddepth参数的值设为-1,让处理结果与原始图像保持一致。但是,如果直接将参数ddepth的值设置为1,在计算时的带的结果可能是错误的。
在实际操作中,计算的梯度值可能会出现负数。如果处理的图像是8位图类型,则在ddepth的参数值为-1时,意味着指定运算结果也是8位图类型,那么所有的负数会自动截断为0,发生信息丢失。
为了避免信息丢失,在计算时要先使用更高的数据类型cv2.CV_64F,再通过取绝对值将其映射为cv2.CV_8U(8位图)。

sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx) #取绝对值

2.Scharr算子:scharr算子运算准确度更高,效果更好
在这里插入图片描述

scharry = cv2.Scharr(img, cv2.CV_64F, 1, 0)

3.laplacian算子
Laplacian算子具有各方向同性的特点,能够对任意方向的边缘进行提取,具有无方向性的优点,因此使用Laplacian算子提取边缘不需要分别检测X方向的边缘和Y方向的边缘,只需要一次边缘检测即可。Laplacian算子是一种二阶导数算子,对噪声比较敏感,因此常需要配合高斯滤波一起使用.
在这里插入图片描述

laplacian = cv2.Laplacian(img, cv2.CV_64F)

Canny边缘检测

  1. 使用高斯滤波器,以平滑图像,滤除噪声。

  2. 计算图像中每个像素点的梯度强度和方向。

  3. 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。

  4. 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
    在这里插入图片描述

  5. 通过抑制孤立的弱边缘最终完成边缘检测。

图像轮廓

cv2.findContours(img,mode,method)

mode:轮廓检索模式

  • RETR_EXTERNAL :只检索最外面的轮廓;
  • RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中;
  • RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
  • RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次;

method:轮廓逼近方法

  • CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
  • CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。
#转换灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#使用阈值操作转换为二值图像
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
#像素点大于127为255,否则为0
#发现轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
#传入绘制图像,轮廓,轮廓索引,颜色模式,线条厚度
# 注意需要copy,要不原图会变。。。
draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)
#轮廓特征
cnt = contours[0]
cv2.contourArea(cnt)#面积
cv2.arcLength(cnt,True)#周长,True表示闭合的
#轮廓近似
approx = cv2.approxPolyDP(cnt, epsilon, True)

视频与摄像头的读取

#读取,参数为视频的路径 或者为0表示读取笔记本默认的摄像头
vc = cv2.VideoCapture('test.mp4') 
vc = cv2.VideoCapture(0)
#检查是否打开正确 
if vc.isOpened(): 
    oepn, frame = vc.read()
else:
    open = False
#展示 
#按帧读取视频,返回值ret是布尔型,正确读取则返回True,读取失败或读取视频结尾则会返回False。
#frame为每一帧的图像,这里图像是三维矩阵,读取的图像为BGR格式。
while open:
    ret, frame = vc.read()
    if frame is None:
        break
    if ret == True:
        gray = cv2.cvtColor(frame,  cv2.COLOR_BGR2GRAY)
        cv2.imshow('result', gray)
        if cv2.waitKey(100) & 0xFF == 27:
            break
vc.release()
cv2.destroyAllWindows()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值