Opencv

基本操作

图像:

img --------------------读取
cv2.IMREAD_COLOR-------------------彩色图像

img=cv2.imread('cat.jpg')

cv2.IMREAD_GRAYSCALE---------------灰度图像

img=cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE)
img

保存

cv2.imwrite('mycat.png',img)

边界填充

  • BORDER_REPLICATE:复制法,也就是复制最边缘像素。
  • BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
  • BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
  • BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg
  • BORDER_CONSTANT:常量法,常数值填充。
top_size,bottom_size,left_size,right_size = (50,50,50,50)

replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0)

图像融合

plt.imshow(res)

视频

 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(50) & 0xFF == 27:
            break
vc.release()
cv2.destroyAllWindows()

图像处理

图像阈值

ret, dst = cv2.threshold(src, thresh, maxval, type)
src: 输入图,只能输入单通道图像,通常来说为灰度图

dst: 输出图

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的反转

平滑操作

均值滤波

# 均值滤波
# 简单的平均卷积操作
blur = cv2.blur(img, (3, 3))

cv2.imshow('blur', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

方框滤波


# 基本和均值一样,可以选择归一化,容易越界
box = cv2.boxFilter(img,-1,(3,3), normalize=False)  

cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()

高斯滤波

# 高斯滤波
# 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
aussian = cv2.GaussianBlur(img, (5, 5), 1)  

cv2.imshow('aussian', aussian)
cv2.waitKey(0)
cv2.destroyAllWindows()

中值滤波

所有噪音点都不见了但是图象有些失真

# 相当于用中值代替
median = cv2.medianBlur(img, 5)  # 中值滤波

cv2.imshow('median', median)
cv2.waitKey(0)
cv2.destroyAllWindows()

展示所有的

res = np.hstack((blur,aussian,median))
#print (res)
cv2.imshow('median vs average', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

形态学腐蚀

kernel

kernel = np.ones((3,3),np.uint8) 
erosion = cv2.erode(img,kernel,iterations = 1)

cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

开运算与闭运算

开:先腐蚀,再膨胀

img = cv2.imread('dige.png')

kernel = np.ones((5,5),np.uint8) 
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

闭:先膨胀,再腐蚀

img = cv2.imread('dige.png')

kernel = np.ones((5,5),np.uint8) 
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

礼帽与黑帽

礼帽=原始输入-开运算结果(剩下刺)
黑帽=闭运算-原始输入(只剩下边界整体了)

礼帽
img = cv2.imread('dige.png')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
黑帽
mg = cv2.imread('dige.png')
blackhat  = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat ', blackhat )
cv2.waitKey(0)
cv2.destroyAllWindows()

图像梯度

边缘位置会产生梯度,在像素层面数值发生了较大的变化

Sobel算子

类似高斯,临近点权值更大一些
右减左,下减上。
在这里插入图片描述
dst = cv2.Sobel(src, ddepth, dx, dy, ksize)

ddepth:图像的深度
dx和dy分别表示水平和竖直方向
ksize是Sobel算子的大小

img = cv2.imread('pie.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()
def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)

cv_show(sobelx,'sobelx')

白到黑是正数,黑到白就是负数了,所有的负数会被截断成0,所以要取绝对值,convert一下;

sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)  
cv_show(sobely,'sobely')

得到sobel x之后 接下来计算sobel y;

sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)  
cv_show(sobely,'sobely')

Scharr算子

整体计算方式是一样的,只不过对结果的差异更敏感;
在这里插入图片描述

拉普拉斯算子

提到了二阶导的概念,对变化更敏感,但对噪音点也很敏感;
没有x,y的概念了,也不用单独求再求合并;
直接进行操作,负值换正值就可以了;
在这里插入图片描述

边缘检测

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:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。

模板匹配

跟卷积的原理很像,模板从原图像的原点位置开始华东,计算模板与图象被模板覆盖的地方的差别程度,这个差别成都的计算方法在opencv中有六种,然后每次的计算结果放在一个矩阵里,作为结果输出;

匹配多个模板

直方图

cv2.calcHist(images,channels,mask,histSize,ranges)
  • images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]
  • channels: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的参数可以是 [0][1][2] 它们分别对应着 BGR。
  • mask: 掩模图像。统整幅图像的直方图就把它为 None。但是如 果你想统图像某一分的直方图的你就制作一个掩模图像并 使用它。主要告诉我们正在统计哪一部分。
  • histSize:BIN 的数目,也应用中括号括来
  • ranges: 像素值范围常为 [0256]

比如:

 img = cv2.imread('cat.jpg',0) #0表示灰度图
hist = cv2.calcHist([img],[0],None,[256],[0,256])
hist.shape

直方图均衡化

核心就是在映射当中;
直方图均衡化函数:equalizeHist

img = cv2.imread('clahe.jpg',0) #0表示灰度图 #clahe
plt.hist(img.ravel(),256); 
plt.show()
equ = cv2.equalizeHist(img) 
plt.hist(equ.ravel(),256)
plt.show()
自适应直方图均衡化

要保存一些局部细节的时候,用全局直方图均衡化结果会不太好

傅里叶变换

多用于在频域当中对图像做处理;

作用:

高频:变化剧烈的灰度分量,例如边界
低频:变化缓慢的灰度分量,例如一片大海

滤波

低通:只保留低频,会使图像变得模糊;(动的慢的)
高通:只保留高频,会使图像细节增强;(动的快的)

  • opencv中主要就是cv2.dtf和cv2.idft(),输入图像需要先转换成np.float32的格式;
  • 得到的结果会在左上角,执行一个shift变换到中心位置;
  • 返回的结果是双通道的(实部虚部),通常还需要转化成图像格式才能展示(0,255)

图像特征

图像特征-harris

角点检测

无论是沿着水平还是竖直都是边界变化比较明显的就是角点。
在这里插入图片描述
无论沿着什么方向移动,灰度级都会发生变化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值